Hệ thống   Học viện mạng   Nghiên cứu Phát triển 
Đổi mật khẩu
Cập nhật thông tin cá nhân
Trang cá nhân
Xem học viên các lớp học
Ý tưởng
Dự án của thành viên
Vũ Xuân Hoàng | Thoát 

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG

KHOA CÔNG NGHỆ THÔNG TIN 1

 

 

 

 

 

 

 

 

 

 

 

 

 

BÀI GIẢNG

HỆ THỐNG PHÂN TÁN

(Dùng cho đề cương INT 1405)

 

 

 

 

 

 

 

 

 

 

Người biên soạn: ThS. Nguyễn Xuân Anh

Đơn vị công tác: Bộ môn Hệ thống thông tin

Khoa CNTT 1

 

 

 

 

 

 

 

Hà nội  09/2021


MỤC LỤC

 

 

CHƯƠNG 1:       TỔNG QUAN VỀ HỆ THỐNG PHÂN TÁN................................................. 9

1.1       Định nghĩa hệ thống phân tán......................................................................................... 9

1.2       Quan điểm về phần cứng............................................................................................ 10

1.2.1     Hệ thống nhiều bộ vi xử lý......................................................................... 11

1.2.2     Hệ thống nhiều máy tính............................................................................ 13

1.3       Quan điểm về phần mềm............................................................................................. 13

1.3.1     Hệ điều hành............................................................................................... 13

1.3.1.1     Hệ điều hành chạy trên một bộ xử lý............................................................... 14

1.3.1.2     Hệ điều hành cho nhiều bộ xử lý...................................................................... 14

1.3.1.3     Hệ điều hành mạng và hệ điều hành phân tán................................................... 14

1.3.2     Phần mềm ứng dụng.................................................................................... 15

1.4       Phân  loại hệ thống phân tán........................................................................................ 15

1.4.1     Các hệ thống điện toán phân tán................................................................ 15

1.4.1.1     Hệ thống điện toán cụm.................................................................................. 15

1.4.1.2     Hệ thống điện toán lưới................................................................................... 16

1.4.2     Hệ thống thông tin phân tán....................................................................... 17

1.4.3     Hệ thống lan tỏa.......................................................................................... 18

1.4.4     Điện toán đám mây..................................................................................... 19

1.5       Mục tiêu hệ thống phân tán......................................................................................... 20

1.5.1     Đảm bảo khả năng sẵn sàng của tài nguyên............................................... 21

1.5.2     Trong suốt đối với người sử dụng.............................................................. 22

1.5.2.1     Phân loại tính trong suốt.................................................................................. 22

1.5.2.2     Mức độ trong suốt.......................................................................................... 23

1.5.3     Tính mở của hệ thống................................................................................. 24

1.5.4     Qui mô hệ thống......................................................................................... 25

1.5.4.1     Các vấn đề liên quan đến qui mô hệ thống....................................................... 25

1.5.4.2     Các kỹ thuật xử lý qui mô hệ thống................................................................. 27

1.5.5     Hệ thống phân tán và mạng máy tính......................................................... 28

1.6       Kiến trúc hệ thống phân tán......................................................................................... 29

1.6.1     Các mô hình kiến trúc................................................................................ 29

1.6.1.1     Mô hình phân tầng.......................................................................................... 30

1.6.1.2     Mô hình đối tượng phân tán............................................................................ 30

1.6.1.3     Mô hình kênh sự kiện..................................................................................... 31

1.6.1.4     Mô hình dữ liệu tập trung................................................................................ 32

1.6.2     Kiến trúc hệ thống...................................................................................... 33

1.6.2.1     Kiến trúc tập trung.......................................................................................... 33

1.6.2.2     Kiến trúc không tập trung................................................................................ 38

1.6.2.3     Kiến trúc lai ghép............................................................................................ 41

1.6.3     Kiến trúc hệ thống và phần mềm trung gian.............................................. 41

1.6.4     Tự quản lý trong các hệ thống phân tán..................................................... 41

CHƯƠNG 2:       TRAO ĐỔI THÔNG TIN TRONG HỆ THỐNG PHÂN TÁN..................... 43

2.1       Cơ sở truyền thông..................................................................................................... 43

2.1.1     Giao thức mạng........................................................................................... 43

2.1.1.1     Các giao thức mức thấp.................................................................................. 45

2.1.1.2     Giao thức tầng vận tải..................................................................................... 46

2.1.1.3     Các giao thức mức cao................................................................................... 46

2.1.1.4     Giao thức tầng trung gian................................................................................ 47

2.1.2     Phân loại truyền thông................................................................................ 47

2.2       Gọi thủ tục từ xa......................................................................................................... 49

2.2.1     Cơ chế hoạt động........................................................................................ 49

2.2.2     Vấn đề truyền tham số................................................................................ 52

2.2.3     Các phương pháp gọi thủ tục từ xa............................................................. 53

2.2.4     Đối tượng phân tán...................................................................................... 54

2.3       Truyền thông điệp....................................................................................................... 55

2.3.1     Các phương pháp truyền thông điệp.......................................................... 55

2.3.2     Truyền thông điệp nhất thời....................................................................... 56

2.3.2.1     Các hàm nguyên thủy...................................................................................... 56

2.3.2.2     Giao diện chuyển thông điệp........................................................................... 57

2.3.3     Truyền thông điệp bền bỉ............................................................................ 59

2.4       Truyền thông luồng..................................................................................................... 60

2.4.1     Hỗ trợ truyền thông liên tục...................................................................... 61

2.4.2     Luồng và chất lượng dịch vụ....................................................................... 62

2.4.3     Đồng bộ luồng............................................................................................. 63

2.5       Truyền thông theo nhóm.............................................................................................. 65

2.5.1     Truyền thông theo nhóm mức ứng dụng.................................................... 65

2.5.1.1     Tổ chức hình cây............................................................................................ 65

2.5.1.2     Quảng bá trong nhóm..................................................................................... 67

2.5.2     Lan truyền ngẫu nhiên................................................................................. 68

CHƯƠNG 3:       ĐẶT TÊN TRONG HỆ THỐNG PHÂN TÁN.............................................. 72

3.1       Tên, định danh và địa chỉ............................................................................................. 72

3.2       Đặt tên và các giải pháp tìm kiếm................................................................................ 72

3.2.1     Đặt tên phi cấu trúc..................................................................................... 72

3.2.1.1     Các giải pháp tìm kiếm đơn giản...................................................................... 73

3.2.1.2     Tìm kiếm dựa trên nguồn gốc.......................................................................... 74

3.2.1.3     Bảng băm phân tán......................................................................................... 75

3.2.1.4     Cách tiếp cận phân cấp................................................................................... 77

3.2.2     Đặt tên có cấu trúc...................................................................................... 80

3.2.2.1     Không gian tên............................................................................................... 80

3.2.2.2     Phân giải tên................................................................................................... 81

3.2.2.3     Cài đặt không gian tên.................................................................................... 83

3.2.2.4     Hệ thống tên miền trên Internet........................................................................ 88

3.2.3     Đặt tên dựa trên thuộc tính......................................................................... 92

3.2.3.1     Dịch vụ thư mục............................................................................................. 93

3.2.3.2     Cài đặt phân cấp............................................................................................ 93

3.2.3.3     Cài đặt không tập trung................................................................................... 95

CHƯƠNG 4:       ĐỒNG BỘ VÀ CÁC GIẢI THUẬT PHÂN TÁN......................................... 98

4.1       Đồng bộ đồng hồ vật lý............................................................................................... 98

4.1.1     Giải thuật Cristian.................................................................................... 100

4.1.2     Giải thuật Berkeley.................................................................................. 101

4.1.3     Giải thuật trung bình................................................................................. 101

4.1.4     Giải thuật tham chiếu quảng bá................................................................ 102

4.2       Thời gian và đồng hồ logic......................................................................................... 103

4.2.1     Đồng hồ Lamport..................................................................................... 104

4.2.2     Đồng hồ vector......................................................................................... 106

4.2.3     Trạng thái toàn cục................................................................................... 108

4.3       Các giải thuật loại trừ tương hỗ phân tán.................................................................... 109

4.3.1     Giải thuật tập trung................................................................................... 110

4.3.2     Giải thuật không tập trung........................................................................ 110

4.3.3     Giải thuật phân tán.................................................................................... 111

4.3.4     Giải thuật thẻ bài....................................................................................... 111

4.3.5     So sánh các giải thuật loại trừ.................................................................. 112

4.4       Các giải thuật bầu chọn............................................................................................. 112

4.4.1     Các giải thuật bầu chọn truyền thống...................................................... 113

4.4.1.1     Giải thuật nổi bọt.......................................................................................... 113

4.4.1.2     Giải thuật vòng.............................................................................................. 113

4.4.2     Bầu chọn trong môi trường không dây.................................................... 114

4.4.3     Bầu chọn trong các hệ thống qui mô lớn................................................ 115

4.5       Hệ thống định vị........................................................................................................ 116

4.5.1     Định vị toàn cầu các nút........................................................................... 116

4.5.2     Kỹ thuật định vị khác................................................................................ 116

4.5.3     Định vị logic các nút................................................................................ 116

CHƯƠNG 5:       TIẾN TRÌNH TRONG CÁC HỆ THỐNG PHÂN TÁN............................. 117

5.1       Các luồng................................................................................................................. 117

5.1.1     Khái niệm luồng....................................................................................... 117

5.1.2     Luồng trong các hệ thống độc lập........................................................... 118

5.1.3     Cài đặt luồng............................................................................................. 119

5.1.4     Luồng trong các hệ thống phân tán.......................................................... 120

5.1.4.1     Đa luồng trên máy khách............................................................................... 120

5.1.4.2     Đa luồng trên máy chủ.................................................................................. 120

5.2       Ảo hóa..................................................................................................................... 122

5.2.1     Vai trò ảo hóa trong các hệ thống phân tán............................................. 122

5.2.2     Kiến trúc của các máy ảo......................................................................... 123

5.3       Máy khách............................................................................................................... 124

5.3.1     Giao diện người sử dụng mạng................................................................ 124

5.3.2     Phần mềm máy khách đảm bảo tính trong suốt phân bố........................ 125

5.4       Máy chủ................................................................................................................... 126

5.4.1     Các vấn đề thiết kế chung........................................................................ 126

5.4.2     Cụm máy chủ............................................................................................ 127

5.4.2.1     Các mô hình cài đặt...................................................................................... 127

5.4.2.2     Quản lý cụm máy chủ.................................................................................... 128

5.5       Di  trú mã................................................................................................................. 128

5.5.1     Các giải pháp di trú mã............................................................................. 128

5.5.2     Di trú và tài nguyên cục bộ...................................................................... 130

5.5.3     Di trú trong hệ thống không đồng nhất................................................... 130

CHƯƠNG 6:       QUẢN TRỊ GIAO TÁC VÀ ĐIỀU KHIỂN TƯƠNG TRANH................... 131

6.1       Khái niệm giao tác.................................................................................................... 132

6.1.1     Giao tác phẳng.......................................................................................... 132

6.1.2     Các giao tác lồng nhau............................................................................. 133

6.1.3     Giao tác phân tán...................................................................................... 134

6.2       Các phương pháp điều khiển tương tranh.................................................................. 134

6.2.1     Điều khiển tương tranh bi quan................................................................ 134

6.2.2     Điều khiển tương tranh lạc quan.............................................................. 134

6.2.3     Điều khiển tương tranh dựa trên nhãn thời gian..................................... 135

CHƯƠNG 7:       PHỤC HỒI VÀ TÍNH CHỊU LỖI............................................................... 136

7.1       Giới thiệu tính chịu lỗi................................................................................................ 136

7.1.1     Khái niệm tính chịu lỗi............................................................................ 136

7.1.2     Phân loại lỗi.............................................................................................. 136

7.2       Các biện pháp đảm bảo tính chịu lỗi.......................................................................... 137

7.2.1     Che giấu lỗi bằng biện pháp dư thừa........................................................ 137

7.2.2     Tiến trình bền bỉ........................................................................................ 138

7.2.2.1     Lựa chọn mô hình cài đặt.............................................................................. 138

7.2.2.2     Che giấu lỗi và nhân bản............................................................................... 139

7.2.2.3     Đồng thuận trong các hệ thống lỗi.................................................................. 139

7.2.2.4     Phát hiện lỗi.................................................................................................. 142

7.2.3     Truyền thông khách/chủ tin cậy............................................................... 142

7.2.3.1     Truyền thông điểm – điểm............................................................................. 143

7.2.3.2     Các tình huống lỗi khi thủ tục từ xa................................................................ 143

7.2.4     Truyền thông nhóm tin cậy...................................................................... 146

7.2.4.1     Truyền thông nhóm tin cậy cơ bản................................................................. 146

7.2.4.2     Truyền thông  nhóm tin cậy trong các hệ thống lớn......................................... 146

7.3       Khẳng định phân tán................................................................................................. 148

7.3.1     Giao thức khẳng định một pha................................................................. 148

7.3.2     Giao thức khẳng định hai pha................................................................... 149

7.3.3     Giao thức khẳng định ba pha.................................................................... 149

7.4       Phục hồi................................................................................................................... 151

7.4.1     Các biện pháp phục hồi............................................................................ 151

7.4.2     Điểm kiểm tra........................................................................................... 152

7.4.2.1     Điểm kiểm tra độc lập................................................................................... 153

7.4.2.2     Điểm kiểm tra phối hợp................................................................................. 154

7.4.3     Ghi nhật ký thông điệp............................................................................. 154

CHƯƠNG 8:       NHẤT QUÁN VÀ NHÂN BẢN................................................................. 157

8.1       Giới thiệu chung........................................................................................................ 157

8.1.1     Lý do nhân bản.......................................................................................... 157

8.1.2     Nhân bản là kỹ thuật mở rộng qui mô...................................................... 158

8.2       Các mô hình nhất quán lấy dữ liệu làm trung tâm........................................................ 159

8.2.1     Nhất quán liên tục..................................................................................... 160

8.2.2     Nhất quán theo thứ tự thao tác................................................................. 162

8.2.2.1     Mô hình nhất quán nghiêm ngặt..................................................................... 162

8.2.2.2     Mô hình nhất quán tuần tự............................................................................. 163

8.2.2.3     Mô hình nhất quán nhân quả.......................................................................... 164

8.2.2.4     Mô hình nhất quán hàng đợi.......................................................................... 165

8.2.3     Nhất quán theo nhóm các thao tác........................................................... 166

8.2.3.1     Mô hình nhất quán yếu.................................................................................. 167

8.2.3.2     Mô hình nhất quán đi ra................................................................................ 167

8.2.3.3     Mô hình nhất quán đi vào.............................................................................. 168

8.2.4     Tính nhất quán gắn kết.......................................................................... 169

8.3       Nhất quán lấy máy khách làm trung tâm..................................................................... 169

8.3.1     Mô hình nhất quán sau cùng..................................................................... 170

8.3.2     Mô hình nhất quán đọc đều...................................................................... 170

8.3.3     Mô hình nhất quán ghi đều....................................................................... 171

8.3.4     Nhất quán đọc kết quả ghi........................................................................ 172

8.3.5     Nhất quán ghi sau khi đọc........................................................................ 172

8.4       Quản lý các bản sao................................................................................................. 173

8.4.1     Vị trí máy chủ bản sao.............................................................................. 173

8.4.2     Bản sao nội dung và vị trí......................................................................... 173

8.4.2.1     Bản sao thường trực..................................................................................... 173

8.4.2.2     Bản sao khởi nguồn từ máy chủ..................................................................... 174

8.4.2.3     Bản sao khởi nguồn từ máy khách................................................................. 174

8.4.3     Phân phát nội dung.................................................................................... 175

8.4.3.1     Trạng thái và thao tác.................................................................................... 175

8.4.3.2     Các giao thức kéo và đẩy............................................................................. 176

8.4.3.3     Phương pháp lan truyền cập nhật................................................................... 177

8.5       Các giao thức nhất quán........................................................................................... 177

8.5.1     Nhất quán liên tục..................................................................................... 177

8.5.1.1     Giới hạn sai số.............................................................................................. 178

8.5.1.2     Giới hạn chênh lệch trạng thái........................................................................ 179

8.5.1.3     Giới hạn độ  lệch thứ tự................................................................................ 179

8.5.2     Các giao thức dựa trên bản chính............................................................ 179

8.5.2.1     Giao thức ghi từ xa....................................................................................... 180

8.5.2.2     Giao thức ghi cục bộ..................................................................................... 181

8.5.3     Các giao thức nhân bản cập nhật.............................................................. 181

8.5.3.1     Nhân bản tích cực........................................................................................ 182

8.5.3.2     Giao thức dựa trên đại diện........................................................................... 182

8.5.4     Giao thức gắn kết bộ nhớ cache.............................................................. 183

8.5.5     Cài đặt nhất quán lấy máy khách làm trung tâm...................................... 184

8.5.5.1     Cài đặt đơn thuần......................................................................................... 184

8.5.5.2     Nâng cao hiệu năng...................................................................................... 185

CHƯƠNG 9:       BẢO MẬT.................................................................................................. 187

9.1       Giới thiệu chung........................................................................................................ 187

9.1.1     Các hình thức xâm phạm hệ thống thông tin........................................... 187

9.1.1.1     Tấn công thăm dò......................................................................................... 189

9.1.1.2     Truy nhập trái phép....................................................................................... 189

9.1.1.3     Tấn công từ chối dịch vụ............................................................................... 189

9.1.1.4     Phần mềm độc hại........................................................................................ 189

9.1.2     Các vấn đề thiết kế................................................................................... 190

9.1.2.1     Xác định trọng tâm bảo mật.......................................................................... 190

9.1.2.2     Phân tầng cơ chế bảo mật............................................................................. 191

9.1.2.3     Phân bố cơ chế bảo mật............................................................................... 192

9.1.2.4     Tính đơn giản trong thiết kế bảo mật.............................................................. 193

9.1.3     Mã hóa....................................................................................................... 194

9.1.3.1     Giải thuật mã hóa DES.................................................................................. 195

9.1.3.2     Giải thuật mã hóa RAS................................................................................. 196

9.1.3.3     Hàm băm MD5............................................................................................ 197

9.2       Các kênh bảo mật.................................................................................................... 198

9.2.1     Xác thực.................................................................................................... 198

9.2.1.1     Xác thực dựa trên khóa bí mật...................................................................... 198

9.2.1.2     Xác thực sử dụng trung tâm phân phối khóa.................................................. 200

9.2.1.3     Xác thực dựa trên mã hóa khóa công khai.................................................... 202

9.2.2     Toàn vẹn và bí mật thông điệp................................................................. 202

9.2.2.1     Chữ ký số.................................................................................................... 202

9.2.2.2     Khóa phiên................................................................................................... 203

9.2.3     Truyền thông nhóm bảo mật.................................................................... 204

9.2.3.1     Bí mật truyền thông trong  nhóm.................................................................... 204

9.2.3.2     Bảo mật các máy chủ nhân bản..................................................................... 204

9.2.4     Xác thực bằng Kerberos.......................................................................... 205

9.3       Kiểm soát truy nhập.................................................................................................. 207

9.3.1     Nguyên lý kiểm soát truy nhập................................................................ 207

9.3.1.1     Ma trận kiểm soát truy nhập.......................................................................... 207

9.3.1.2     Miền bảo vệ................................................................................................. 208

9.3.2     Tường lửa.................................................................................................. 208

9.3.3     Bảo mật mã di động.................................................................................. 209

9.3.3.1     Bảo vệ Agent............................................................................................... 209

9.3.3.2     Bảo vệ đích.................................................................................................. 210

9.3.4     Từ chối dịch vụ......................................................................................... 213

9.4       Quản lý bảo mật....................................................................................................... 214

9.4.1     Quản lý  khóa............................................................................................ 214

9.4.1.1     Thiết lập khóa............................................................................................... 215

9.4.1.2     Phân phát khóa............................................................................................. 215

9.4.1.3     Thời gian sống của chứng chỉ......................................................................... 217

9.4.2     Quản lý bảo mật nhóm.............................................................................. 217

9.4.3     Quản lý ủy quyền...................................................................................... 218

9.4.3.1     Khả năng và chứng chỉ thuộc tính.................................................................. 218

9.4.3.2     Ủy nhiệm...................................................................................................... 220

9.5       Một số vấn đề bảo mật khác..................................................................................... 221

CHƯƠNG 10:     CÔNG NGHỆ PHÁT TRIỂN HỆ THỐNG PHÂN TÁN............................ 223

10.1     Gọi thủ tục từ xa....................................................................................................... 223

10.2     Mô hình đối tượng thành phần phân tán..................................................................... 226

10.2.1  Các đặc trưng cơ bản của DCOM............................................................ 226

10.2.2  Kiến trúc của DCOM............................................................................... 226

10.3     Kiến trúc môi trường yêu cầu đối tượng chung........................................................... 226

10.3.1  Các thành phần cơ bản của CORBA........................................................ 227

10.3.1.1       Môi trường ORB...................................................................................... 228

10.3.1.2       Ứng dụng  máy khách............................................................................... 230

10.3.1.3       Đối tượng thực hiện.................................................................................. 230

10.3.2  Corba và các yêu cầu phần mềm trung gian............................................ 244

10.3.2.1       Ngôn ngữ định nghĩa giao diện.................................................................. 244

10.3.2.2       Xác định địa chỉ đối tượng phục vụ............................................................ 244

10.3.2.3       Gọi đối tượng phục vụ.............................................................................. 244

10.3.3  Áp dụng CORBA trong xây dựng ứng dụng phân tán.............................. 244

10.3.3.1       Xây dựng ứng dụng trên máy chủ.............................................................. 244

10.3.3.2       Xây dựng ứng dụng máy khách................................................................. 245

10.4     Gọi phương thức từ xa trong Java............................................................................. 245

10.4.1  Mô hình khách/chủ................................................................................... 245

10.4.2  Các cơ chế liên quan................................................................................ 245

10.4.3  Các lớp hỗ trợ........................................................................................... 246

10.4.4  Xây dựng một ứng dụng phân tán với RMI.............................................. 246

10.4.4.1       Thiết kế và cài đặt các thành phần của ứng dụng........................................ 246

10.4.4.2       Biên dịch các tập tin nguồn và tạo Stubs và Skeleton................................. 246

10.4.4.3       Tạo các lớp có thể truy xuất từ mạng......................................................... 247

10.4.4.4       Thực thi ứng dụng..................................................................................... 247

10.5     Dịch vụ web............................................................................................................. 247

10.5.1  Các thành phần trong kiến trúc dịch vụ Web.......................................... 247

10.5.2  Trao đổi thông tin của dịch vụ Web......................................................... 248

10.5.2.1       Giao thức SOAP...................................................................................... 248

10.5.2.2       Ngôn ngữ WSDL..................................................................................... 249

10.5.2.3       Thư mục UDDI........................................................................................ 249

10.5.3  Quy trình xây dựng ứng dụng dịch vụ Web............................................. 249

10.6     Kiến trúc hướng dịch vụ............................................................................................ 250

10.6.1  Giới thiệu về kiến trúc hướng dịch vụ..................................................... 250

10.6.2  Các dịch vụ................................................................................................ 251

10.6.3  Mô hình cặp lỏng...................................................................................... 252

10.6.4  Chu kỳ sống dịch vụ.................................................................................. 253

10.6.5  Phân loại dịch vụ....................................................................................... 253

10.6.6  Trục dịch vụ doanh nghiệp....................................................................... 253

10.6.7  Các mô hình dựa trên SOA...................................................................... 254

10.6.8  Các mẫu trao đổi thông điệp................................................................... 254

CHƯƠNG 11:     THỰC HÀNH............................................................................................. 255

11.1     Truyền thông nhất thời............................................................................................... 255

11.2     Viết ứng dụng dịch vụ web........................................................................................ 255

11.3     Giao thức NTP......................................................................................................... 256

TÀI LIỆU THAM KHẢO........................................................................................................ 257

 


CHƯƠNG 1:                   TỔNG QUAN VỀ HỆ THỐNG PHÂN TÁN

Các hệ thống máy tính đang phát triển mạnh mẽ, kể từ sau khi máy tính điện tử đầu tiên ANIAC ra đời vào năm 1946 cho đến năm 1980 các máy tính có kích thước lớn và khá đắt tiền, do đó nhiều cơ quan chỉ có vài máy tính và thiếu phương tiện kết nối chúng, những máy tính này vận hành độc lập với nhau. Tuy nhiên bắt đầu từ năm 1980, những tiến bộ về công nghệ đã làm thay đổi tình hình, tiến bộ thứ nhất là sự phát triển mạnh mẽ bộ vi xử lý cho máy tính cá nhân, ban đầu thanh ghi chỉ có 8 bit rồi sau đó chuyển dần sang 16, 32 và hiện nay là 64 bit, chúng có khả năng tính toán như một máy tính lớn nhưng giá thành lại thấp hơn rất nhiều. Bước tiến bộ thứ hai đó là sự phát minh ra mạng máy tính tốc độ cao, các mạng cục bộ cho phép kết nối hàng trăm máy tính với băng thông lên tới 10 Gbit/s, các mạng diện rộng cho phép kết nối hàng triệu máy tính với băng thông từ 64 Kbit/s đến Gbit/s. Với những thành tựu này có thể kết nối số lượng lớn máy tính với nhau qua mạng tốc độ cao, chúng khác hẳn với các hệ thống tập trung chỉ bao gồm máy tính và một số thiết bị ngoại vi phục vụ cho các thao tác của người dùng.

1.1        Định nghĩa hệ thống phân tán

Hệ thống phân tán bao gồm các máy tính và các thiết bị khác như thiết bị cầm tay, điện thoại di động thông minh… được kết nối với nhau để thực hiện nhiệm vụ tính toán. Hệ thống phân tán xuất phát từ nhu cầu sử dụng khả năng tính toán tốt hơn và hiệu quả hơn bằng cách kết hợp khả năng tính toán của từng máy tính độc lập, điều đó đã trở thành hiện thực dựa trên những tiến bộ về công nghệ mạng. Ba yếu tố quyết định tốc độ tính toán trong các máy tính bao gồm tốc độ của bộ vi xử lý trung tâm CPU, bộ nhớ RAM và kênh truyền trên bo mạch chủ. Đối với hệ thống phân tán, một yêu cầu mới quan trọng đã nảy sinh đó là vấn đề trao đổi thông tin giữa các máy tính, thiếu yếu tố này thì nhiệm vụ tính toán trên môi trường phân tán sẽ không thể thực hiện được. Tốc độ truyền dẫn trong các công nghệ mạng ngày càng tăng đã tạo điều kiện cho sự phát triển các ứng dụng phân tán, các máy tính có thể trao đổi thông tin và chia sẻ dữ liệu với nhau mà không phụ thuộc vào khoảng cách địa lý.

Trong hệ thống phân tán, các phần mềm ứng dụng chạy trên các máy tính trao đổi thông tin với nhau qua mạng, chúng trao đổi thông tin và phối hợp các hoạt động chỉ bằng cách truyền thông điệp làm cho người dùng cảm giác như đang sử dụng một hệ thống đơn lẻ. Khái niệm phân tán được thể hiện bởi tính độc lập của  từng máy tính nhưng phải phối hợp làm việc với nhau để người sử dụng không có cảm giác các thành phần rời rạc. Ví dụ, một hệ thống bán hàng gồm nhiều cửa hàng đặt tại những vị trí khác nhau, việc nhập thông tin hàng hóa được thực hiện tại nhiều địa điểm như cửa hàng, nhà kho…, tuy nhiên các nhân viên khai thác đều có thể tìm thấy thông tin theo yêu cầu của mình như thể các thông tin đó đang được lưu trữ trên máy tính của người sử dụng. Nhìn chung việc xây dựng các ứng dụng phân tán phức tạp hơn nhiều so với các ứng dụng tập trung, trong nhiều trường hợp bắt buộc phải xây dựng các ứng dụng phân tán vì những lý do sau:

-         Yêu cầu tính toán phân tán: Ứng dụng chạy trên nhiều máy tính khác nhau nhằm tận dụng khả năng tính toán song song hoặc nhằm mục đích sử dụng khả năng tính toán của các máy tính chuyên dụng để nâng cao hiệu năng của hệ thống.

-         Yêu cầu về khả năng chịu lỗi: Yêu cầu này liên quan tới các hệ thống cần phải đảm bảo an toàn tuyệt đối ngay cả khi có sự cố xảy ra trên một máy tính nào đó thì cũng không làm ảnh hưởng đến hoạt động của toàn bộ hệ thống, điều này được thực hiện bằng cách sử dụng mọi biện pháp nhằm mục đích kịp thời phát hiện và xử lý lỗi.

-         Chia sẻ tài nguyên: Những người sử dụng trao đổi thông tin với nhau thông qua  một ứng dụng trên mạng. Mỗi người sử dụng chạy một ứng dụng phân tán trên máy tính của mình và chia sẻ các đối tượng sử dụng. Một số ứng dụng phải chạy trên nhiều máy tính vì dữ liệu được đặt phân tán trên mạng liên quan đến quyền quản lý và quyền sở hữu dữ liệu: cho phép truy nhập dữ liệu từ xa nhưng không cho phép sao chép để lưu giữ cục bộ.

Trong các hệ thống phân tán, môi trường mạng đóng vai trò quan trọng trong việc phân phát dữ liệu đến các thành phần và tập hợp kết quả tính toán của các thành phần đó. Các máy tính kết nối với nhau trên mạng đảm nhiệm chức năng truyền thông cho các ứng dụng, chúng không chia sẻ bộ nhớ cho nhau do đó không thể sử dụng các biến toàn cục để trao đổi thông tin, thông tin trao đổi giữa các máy tính chỉ được thực hiện thông qua cơ chế trao đổi thông điệp. Mạng là tài nguyên chung của hệ thống do đó khi xây dựng hệ thống phân tán cần phải xem xét đến các vấn đề như: Băng thông, các điểm có thể xảy ra sự cố, bảo mật và an toàn dữ liệu, đồng bộ tiến trình. Quá trình triển khai các ứng dụng trong hệ thống phân tán thường gặp một số khó khăn sau:

-         Trên mạng có nhiều loại máy tính và thiết bị mạng của nhiều nhà sản xuất khác nhau và các máy tính được cài đặt các hệ điều hành khác nhau. Các thiết bị dòng Little endian và big endian thể hiện các bit trong mỗi byte như nhau nhưng sắp xếp thứ tự byte dữ liệu ngược nhau.

-         Khó tích hợp các phần mềm vì chúng được phát triển trên các ngôn ngữ lập trình khác nhau.

-         Thời gian phát triển phần mềm lâu hơn, số lượng dòng lệnh và các thủ tục nhiều hơn, do đó thường kéo theo chi phí xây dựng hệ thống cao.

Thực tế việc xây dựng nền tảng cho các hệ thống phân tán vẫn dựa trên mô hình phân tầng OSI, trong đó 4 tầng thấp (vật lý, liên kết dữ liệu, mạng và giao vận) giải quyết các vấn đề như phát hiện và sửa lỗi, định tuyến...., những vấn đề này thường do hệ điều hành đảm nhiệm. Tuy nhiên việc áp dụng 3 tầng cao (phiên làm việc, trình diễn và ứng dụng) đã được sử dụng trong các sản phẩm nền của hệ thống phân tán nhằm mục đích xử lý các thủ tục kết nối giữa các thành phần phân tán và thể hiện cấu trúc dữ liệu phức tạp của các ứng dụng, các sản phẩm như vậy gọi là phần mềm trung gian. Các ứng dụng phân tán thường được xây dựng dựa trên nền hệ điều hành và các thư viện hỗ trợ việc xử lý phân tán, chúng thực hiện các nhiệm vụ xác định vị trí của các máy tính, đồng bộ và mã hóa thông tin.

1.2       Quan điểm về phần cứng

Các hệ thống phân tán bao gồm nhiều bộ vi xử lý, nhưng có nhiều cách để tổ chức chúng, nó thể hiện ở cách kết nối và trao đổi thông tin như thế nào. Michael J. Flynn đã chỉ ra hai đặc trưng cơ bản cho một hệ thống tính toán là số lượng luồng xử lý lệnh và số lượng kênh chuyển dữ liệu, như vậy về lý thuyết có thể xây dựng 04 loại sau:

-         Đơn luồng xử lý, đơn luồng dữ liệu: Bộ vi xử lý chỉ có một luồng thực thi các lệnh và một kênh truyền dữ liệu, các máy tính cá nhân là ví dụ điển hình của loại này.

-         Đơn luồng xử lý đa luồng dữ liệu: Bao gồm nhiều bộ xử lý nhưng chỉ có 01 bộ xử lý đóng vai trò tiếp nhận các chỉ thị để ra lệnh cho các bộ xử lý khác thực hiện song song.

-         Đa luồng xử lý và đơn luồng dữ liệu: Nhiều bộ xử lý cùng chia sẻ một luồng dữ liệu, thực tế khó có thể tìm thấy máy tính thuộc loại này.

-         Đa luồng xử lý và đa luồng dữ liệu: Nhiều bộ xử lý và nhiều luồng dữ liệu, mỗi bộ xử lý sở hữu bộ đếm chương trình, chương trình và dữ liệu. Như vậy có thể chia làm hai nhóm: hệ thống nhiều bộ xử lý và hệ thống nhiều máy tính. Trong hệ thống nhiều bộ xử lý, các bộ xử lý có quan hệ chặt chẽ với nhau, chúng dùng chung bộ nhớ chia sẻ, như vậy việc trao đổi thông tin giữa các bộ xử lỷ có thể thực hiện đơn giản bằng cách đọc các ô nhớ. Trong hệ thống phân tán, mỗi bộ xử lý sở hữu bộ nhớ riêng, các bộ xử lý ràng buộc không chặt chẽ, hệ thống phân tán thuộc loại này, mỗi máy tính đóng vai trò như một bộ xử lý và chúng trao đổi thông tin với nhau trên nhiều kênh truyền trên mạng.

1.2.1    Hệ thống nhiều bộ vi xử lý

Dựa trên cách kết nối và cách trao đổi thông tin giữa các thành viên, hệ thống phân tán có thể phân thành hệ thống nhiều bộ vi xử lý trong đó các bộ vi xử lý dùng chung bộ nhớ và hệ thống nhiều tính máy tính trong đó mỗi bộ vi xử lý có bộ nhớ riêng. Hệ thống nhiều máy tính được coi là đồng nhất nếu các máy tính cùng chung nền tảng phần cứng, hệ điều hành và mạng ngược lại gọi là hệ thống không đồng nhất. Trong hệ thống nhiều bộ vi xử lý, các bộ vi xử lý dùng chung bộ nhớ, việc trao đổi thông tin giữa các bộ vi xử lý được thực hiện bằng cách đọc/ghi các ô nhớ. Ngoài các chức năng truyền thống của hệ điêu hành  như xử lý gọi hệ thống, quản lý bộ nhớ, quản lý tập tin, quản lý thiết bị vào ra, hệ điều hành của hệ thống nhiều bộ vi xử lý phải thực hiện các chức năng đặc biệt như đồng bộ tiến trình, quản lý tài nguyên, lập lịch làm việc. Trước hết, chúng ta sẽ tìm hiểu sơ bộ về phần cứng của hệ thống nhiều bộ vi xử lý sau đó sẽ đề cập tới các vấn đề về hệ điều hành trong các hệ thống này. Hệ thống nhiều bộ vi xử lý đều có đặc điểm chung là các đơn vị xử lý trung tâm đều được kết nối vào kênh kết nối chung trong bo mạch chủ và truy nhập trực tiếp vào bộ nhớ dùng chung.

Hình 1.16-a minh họa hệ thống nhiều bộ vi xử lý dựa trên một kênh truyền, các đơn vị xử lý trung tâm và các mô-dun bộ nhớ dùng chung một kênh truyền để trao đổi thông tin. Trước khi truy nhập ô  nhớ, đơn vị xử lý trung tâm phải kiểm tra xem kênh truyền có bận hay không, nếu rỗi thì đơn vị xử lý trung tâm đặt địa chỉ ô nhớ lên kênh, phát tín hiệu điều khiển và chờ cho đến khi bộ nhớ đặt giá trị của ô nhớ đã yêu cầu lên kênh truyền. Nếu kênh truyền bận, đơn vị xử lý trung tâm phải chờ cho đến khi kênh truyền rỗi, như vậy nảy sinh vấn đề về quản lý tương tranh. Đối với hệ thống chỉ có hai hoặc ba đơn vị xử lý trung tâm thì việc quản lý tương tranh tương đối đơn giản, vấn đề sẽ trở nên khá phức tạp đối với hệ thống có 32 hoặc 64 đơn vị xử lý trung tâm. Nói chung, hệ thống sẽ bị giới hạn bởi băng thông của kênh truyền và hầu hết các CPU sẽ lãng phí thời gian chờ đọc ô nhớ. Để giải quyết vấn đề này, người ta thêm bộ nhớ đệm vào mỗi CPU như minh họa trên hình 1.16-b, bộ nhớ đệm có thể được tính hợp trong CPU nằm trên bo mạch bộ vi xử lý hoặc tổ hợp các phương án trên. Bộ nhớ đệm trao đổi thông tin với bộ nhớ dùng chung theo phương pháp đọc/ghi từng khối 32 hoặc 64 byte, đơn vị xử lý trung tâm sẽ đọc/ghi các ô nhớ trong bộ nhớ đệm, như vậy sẽ giảm đáng kể lưu lượng trên kênh truyền chung.

(a) Không có bộ nhớ đệm.

(b) Có bộ nhớ đệm.

(c) Có bộ nhớ đệm và bộ nhớ riêng.

Hình  1.16  Ba loại hệ thống nhiều bộ xử lý dựa trên một kênh

 

Mỗi khối bộ nhớ đệm được đánh dấu bởi một trong hai trạng thái, chỉ đọc hoặc đọc/ghi. Nếu CPU muốn ghi một ô nhớ mà ô nhớ đó xuất hiện trong các bộ nhớ đệm khác, phần cứng của kênh truyền sẽ phát hiện tính hiệu ghi và chuyển tín hiệu đó đến tất cả các bộ nhớ đệm khác. Nếu các bộ nhớ đệm này đã có nội dung giống như trong bộ nhớ, chúng có thể từ chối bản sao đó và cho phép bộ điều khiển ghi chốt khối bộ nhớ đệm trong bộ nhớ dùng chung trước khi thay đổi ô nhớ. Một số bộ nhớ đệm đang thay đổi, nó phải ghi lại nội dung ô nhớ đó vào bộ nhớ dùng chung trước khi yêu cầu ghi có thể tiếp tục thực hiện hoặc chuyển trực tiếp giá trị đó đến bộ điều khiển ghi qua kênh truyền.  Hình 1.16-c minh họa một kiến trúc khác, CPU không chỉ có bộ nhớ đệm mà còn có bộ nhớ cục bộ riêng được truy nhập bằng kênh riêng. Để sử dụng cấu hình này một cách tối ưu, trình biên dịch sẽ đặt tất cả chương trình các hằng số, dữ liệu chỉ đọc và các biến số trong bộ nhớ riêng, bộ nhớ dùng chung khi đó sẽ được dùng cho các biến dùng chung. Nói chung, kiến trúc này giảm đáng kể lưu lượng trên kênh chung nhưng nó đòi hỏi trình biên dịch phải có sự phối hợp rất chặt chẽ.

Kiến trúc truy nhập bộ nhớ đồng nhất (UMA) chỉ phù hợp với các hệ thống có ít CPU, khi số lượng CPU tăng lên sẽ phải chi phí lớn cho vấn đề xử lý chuyển mạch, một kiến trúc khác được đề xuất là kiến trúc truy nhập bộ nhớ không đồng nhất (NUMA). Giống như đa xử lý đối xứng, đó là công nghệ mở rộng tính khả biến của máy chủ bằng cách bổ sung thêm bộ xử lý. Cả hai công nghệ này đều cho phép người dùng bắt đầu với những máy chủ tương đối nhỏ và sau đó bổ sung bộ xử lý nếu ứng dụng phát triển thêm. Đối với hầu hết máy chủ đối xứng, việc bổ sung thêm sau khi đã có 8 bộ xử lý rất đắt tiền mà hiệu suất đạt được không cao nhưng NUMA thì cho phép mở rộng hơn lên đến 256 bộ xử lý, liên kết với nhau trong một máy. Tương tự hệ thống UMA, NUMA cho phép khai thác sức mạnh kết hợp của nhiều bộ xử lý mà mỗi bộ xử lý truy cập một cụm bộ nhớ chung. Tuy nhiên, các bộ xử lý được phân thành những nhóm nhỏ hay nút, trong đó tất cả các bộ xử lý đều liên kết với nhau. Chẳng hạn, một máy chủ 16 bộ xử lý có thể sắp xếp thành bốn nút, mỗi nút có bốn bộ xử lý và có bộ nhớ riêng. NUMA làm giảm tình trạng tắc nghẽn bus của kiến trúc đối xứng bằng cách để cho các bộ xử lý trong một nút giao tiếp với nhau và với bộ nhớ cục bộ của chúng qua những bus riêng, nhỏ hơn. Các bộ xử lý cũng có thể truy cập những vùng nhớ của từng nút khác, tuy rằng thời gian truy cập này thay đổi tùy theo khoảng cách giữa các nút, vì thế cơ chế có tên là truy cập bộ nhớ không đồng nhất NUMA. Trong hệ thống nhiều bộ vi xử lý thuần nhất, mỗi đơn vị xử lý trung tâm truy xuất vào bộ nhớ cục bộ, vấn đề còn lại là việc trao đổi thông tin giữa các bộ vi xử lý với nhau. Trong hệ thống nhiều bộ vi xử lý không thuần nhất các máy tính được xây dựng trên nền tảng của các bộ vi xử lý khác nhau.

1.2.2    Hệ thống nhiều máy tính

Xây dựng hệ thống nhiều máy tính khá đơn giản, mỗi bộ xử lý sở hữu không gian bộ nhớ riêng, vấn đề còn lại cần phải giải quyết là việc trao đổi thông tin giữa chúng với nhau. Giải pháp duy nhất cho đến nay là các máy tính được kết nối mạng, khi đó băng thông sẽ nhỏ hơn rất nhiều so với cơ chế đọc/ghi bộ nhớ, hơn nữa thông lượng trong mạng cục bộ còn phụ thuộc vào hình trạng mạng, các máy tính trong một vùng xung đột sẽ phải chia sẻ kênh truyền vật lý. Trong mạng cục bộ, nếu sử dụng đường truyền dạng bus hoặc sử dụng hub để kết nối các máy tính với nhau sẽ hình thành vùng xung đột, tại mỗi thời điểm chỉ cho phép 01 máy tính được gửi dữ liệu. Giải pháp tốt hơn là đấu nối các máy tính theo hình sao sử dụng thiết bị chuyển mạch, khi đó mỗi cổng của bộ chuyển mạch là một vùng xung đột, do đó không làm giảm băng thông của mạng.

1.3       Quan điểm về phần mềm

Phần cứng đóng vai trò quan trọng trong hệ thống phân tán, nhưng phần mềm còn đóng vai trò quan trọng hơn, sự hoạt động của hệ thống hoàn toàn do phần mềm quyết định. Phần mềm hệ thống phân tán bao gồm hai loại: phần mềm nền tảng hay còn gọi là hệ điều hành và phần mềm ứng dụng.

1.3.1       Hệ điều hành

Hệ điều hành cung cấp các tính năng quản lý tài nguyên phần cứng, cho phép nhiều người dùng và nhiều ứng dụng chia sẻ phần cứng như: CPU, bộ nhớ, thiết bị ngoại vi, mạng và tất cả các loại dữ liệu. Hệ điều hành cũng đơn giản hóa sự phức tạp và đa dạng của phần cứng bằng cách tạo ra máy ảo, như vậy các ứng dụng có thể thực hiện dễ dàng hơn. Hệ điều hành cho các máy tính gồm hai loại, hệ điều hành phân tán (DOS) và hệ điều hành mạng (NOS). Hệ điều hành phân tán quản lý tổng thể tất cả các máy tính thuần nhất trong hệ thông phân tán, hệ điều hành mạng thường dùng cho các hệ thống không đồng nhất, mỗi máy tính tạo ra các dịch vụ cung cấp cho các máy tính khác. Từ cuối những năm 1990, một số các dịch vụ do hệ điều hành cung cấp đã được cải tiến và gọi là phần mềm trung gian

Bảng 1.1 Hệ điều hành phân tán, hệ điều hành mạng và phần mềm trung gian.

Hệ thống

Mô tả

Mục tiêu

Hệ điều hành phân tán

Hệ điều hành liên kết chặt dùng cho các hệ thống máy tính thuần nhất

Che giấu và quản lý các tài nguyên phần cứng

Hệ điều hành mạng

Hệ điều hành liên kết lỏng, dùng cho các máy tính không thuần nhất (mạng LAN và mạng WAN)

Cung cấp các dịch vụ cục bộ cho các máy tính khác truy nhập từ xa.

Phần mềm trung gian

Tầng trên của hệ điều hành mạng, cài đặt các dịch vụ mục đích chung.

Cung cấp tính trong suốt cho hệ thống phân tán

 

Có hai loại hệ điều hành phân tán, hệ điều hành phân tán cho hệ thống nhiều bộ vi xử lý và hệ điều hành phân tán cho các máy tính cùng chủng loại. Ngoài khả năng quản lý nhiều bộ vi xử lý, các tính năng khác của các hệ điều hành phân tán cũng tương tự như hệ điều hành dành cho các hệ thống chạy trên một bộ vi xử lý.

1.3.1.1     Hệ điều hành chạy trên một bộ xử lý

Mục tiêu chính của loại hệ điều hành này là cho phép người sử dụng và các phần mềm ứng dụng truy nhập dễ dàng đến các tài nguyên dùng chung như CPU, bộ nhớ chính, đĩa và các thiết bị ngoại vi. Các phần mềm ứng dụng dùng chung tài nguyên của hệ thống nhưng vẫn đảm bảo tính độc lập cho từng ứng dụng, như vậy hệ điều hành cần phải có chính sách chia sẻ các tài nguyên dùng chung đó, điều này chỉ có thể thực hiện bằng cách thiết lập cơ chế máy ảo, cung cấp khẳ năng xử lý đa nhiệm cho các ứng dụng. Ví dụ, để giải quyết vấn đề tương tranh trong hệ thống, các phần mềm ứng dụng không được phép truy nhập trực tiếp đến các tài nguyên mạng, việc truy nhập phải được thực hiện thông qua các hàm nguyên thủy do hệ điều hành cung cấp. Hệ điều hành cần phải nắm toàn bộ quyền kiểm soát việc sử dụng và chia sẻ tài nguyên phần cứng, do đó hầu hết các bộ xử lý hỗ trợ ít nhất hai chế độ:

-         Chế độ lõi: Tất cả các chỉ thị được phép thực hiện và có thể truy nhập toàn bộ bộ nhớ và các thanh ghi trong thời gian thực hiện.

-         Chế độ của người sử dụng: Hạn chế việc truy nhập thanh ghi và bộ nhớ, ví dụ chỉ được phép truy nhập vào vùng nhớ do hệ điều hành qui định, không truy nhập trực tiếp vào các thanh ghi.

1.3.1.2     Hệ điều hành cho nhiều bộ xử lý

Hệ điều hành cho nhiều bộ xử lý là các hệ điều hành dùng để điều khiển sự hoạt động của các hệ thống máy tính có nhiều bộ xử lý, các hệ điều hành cho nhiều bộ xử lý được chia thành hai loại:

-         Đa xử lý đối xứng: Bộ xử lý nào cũng có thể chạy một loại tiến trình bất kỳ, các bộ xử lý giao tiếp với nhau thông qua một bộ nhớ dùng chung. Hệ đối xứng cung cấp một cơ chế chịu lỗi và khả năng cân bằng tải tối ưu hơn, vì các tiến trình của hệ điều hành có thể chạy trên bất kỳ bộ xử lý nào nên nguy cơ xảy ra tình trạng tắc nghẽn ở CPU giảm đi đáng kể. Vấn đề đồng bộ giữa các bộ xử lý được đặt lên hàng đầu khi thiết kế hệ điều hành cho hệ thống đối xứng.

-         Đa xử lý bất đối xứng: Hệ điều hành dành ra một hoặc hai bộ xử lý để sử dụng riêng, các bộ xử lý còn lại dùng để điều khiển các chương trình của người sử dụng. Hệ bất đối xứng đơn giản hơn nhiều so với hệ đối xứng, nhưng trong hệ này nếu có một bộ xử lý trong các bộ xử lý dành riêng cho hệ điều hành bị hỏng thì hệ thống có thể ngừng hoạt động.

1.3.1.3     Hệ điều hành mạng và hệ điều hành phân tán

Hệ điều hành mạng là các hệ điều hành cài đặt trên máy chủ để cung cấp các dịch vụ như quản lý dữ liệu, người dùng, bảo mật, các ứng dụng và các chức nẳng mạng. Ngoài các chức năng cơ bản của một hệ điều hành, các hệ điều hành mạng còn phải thực hiện việc chia sẻ và bảo vệ tài nguyên của mạng. Các hệ điều hành Microsoft Server, Linux, Unix được xếp vào loại hệ điều hành mạng, máy chủ quản lý tài nguyên của mình để cung cấp dịch vụ cho các máy khách. Hệ điều hành phân tán là hệ điều hành được cài đặt trên các máy tính khác nhau để tạo thành một cụm và vận hành như một máy tính có cấu hình mạnh hơn, ví dụ điển hình là sản phẩm LOCUS đã được phát triển vào năm 1980. Mỗi máy tính sở hữu CPU và bộ nhớ riêng, chúng liên kết không chặt chẽ với nhau nhưng cho phép chia sẻ tà các tập tin, người dùng có thể sử dụng các tập tin không có trên máy tính của mình nhưng lại hiện diện ở máy tính khác trong cụm.

1.3.2       Phần mềm ứng dụng

Phần cứng cũng như hệ điều hành cài đặt trên các thiết bị của hệ thống phân tán quan hệ không chặt chẽ với nhau, không cần phải có sự phối hợp cộng tác ngoài việc tuân thủ qui tắc giao thức khi trao đổi thông tin. Bước phát triển tiếp theo là xây dựng phần mềm ứng dụng để cài đặt trên các thành viên của hệ thống phân tán, chúng phải gắn kết chặt chẽ với nhau như một thực thể thống nhất chứ không phải là một tập hợp các máy tính. Nói cách khác, cần phải đảm bảo các máy tính phối hợp với nhau và hoạt động như một máy tính ảo với một bộ xử lý duy nhất, người dùng không có cảm giác về sự tồn tại của nhiều máy tính. Người dùng có thể thực hiện các thao tác giống như trên máy tính của mình, họ có thể mở tập tin, chạy chương trình…, như vậy nếu chỉ tuân thủ các qui tắc về truyền thông chưa đủ, cần phải có nhiều tính năng khác nữa như vấn đề quản lý tiến trình, thống nhất về giao diện trong môi trường phân tán.

1.4       Phân  loại hệ thống phân tán

Trước khi thảo luận nguyên lý của hệ thống phân tán cần thiết phải xem xét các loại hệ thống phân tán, việc phân loại hệ thống phân tán sẽ là cơ sở để phân tích và lựa chọn giải pháp phù hợp để phát triển hệ thống. Hệ thống phân tán gồm ba loại, đó là các hệ thống điện toán phân tán, hệ thống thông tin phân tán và hệ thống lan tỏa phân tán.

1.4.1        Các hệ thống điện toán phân tán

Một trong những vấn đề cơ bản của hệ thống phân tán là phải đảm bảo vấn đề hiệu năng, tính toán phân tán thường được sử dụng trong các tác nghiệp yêu cầu hiệu năng cao. Hệ thống điện toán phân tán chia thành hai nhóm: điện toán cụm và điện toán lưới. Trong hệ thống điện toán cụm, nền tảng phần cứng là tập hợp các máy tính tương tự nhau, chúng được cài đặt các hệ điều hành giống nhau và kết nối với nhau qua đường truyền tốc độ cao, thông thường là mạng cục bộ. Ngược lại, hệ thống điện toán lưới bao gồm các hệ thống phân tán thuộc về nhiều miền quản lý khác nhau và thường không đồng nhất về phần cứng, phần mềm, hệ điều hành và các hệ thống này có thể sử dụng những công nghệ mạng khác nhau.

1.4.1.1     Hệ thống điện toán cụm

Giá thành máy tính ngày càng giảm trong khi khả năng xử lý ngày càng tăng là cơ hội để xây dựng hệ thống điện toán cụm, các máy tính cá nhân được cài đặt một loại hệ điều hành và kết nối với nhau trong mạng tốc độ cao, điện toán cụm sử dụng kỹ thuật xử lý song song trên nhiều máy tính để tăng hiệu năng xử lý cho các tác vụ. Một ví dụ khá quen biết của điện toán cụm là hệ thống  Beowulf  được xây dựng dựa trên hệ điều hành Linux,  mỗi cụm bao gồm nhiều nút trong đó có một nút chủ đảm nhiệm chức năng xắp đặt vị trí của các thành viên khác trong chương trình song song, quản lý hàng đợi các công việc và giao tiếp với người dùng trong hệ thống. Như vậy, nút chủ chỉ việc chạy phần mềm trung gian cần thiết cho các chương trình thực hiện và quản lý cụm, trong khi đó các nút tính toán sẽ không cần gì khác ngoài hệ điều hành chuẩn. Một thành phần quan trọng của phần mềm trung gian là thư viện thực thi chương trình song song, những thư viện này cung cấp các phương tiện trao đổi thông tin dựa trên thông điệp nhưng chưa có khả năng xử lý lỗi, bảo mật...

Hình 1.1 Hệ thống điện toán cụm

 

Một ví dụ khác của điện toán cụm là hệ thống MOSIX được xây dựng dựa trên cách tiếp cận đối xứng, nghĩa là nó cung cấp một hình ảnh đơn của hệ thống cụm. Độ trong suốt rất cao của MOSIX đạt được bằng cách di trú tiến trình, người dùng có thể khởi tạo một tiến trình trên một nút nhưng tiến trình đó có thể di trú sang nút khác để thực hiện nhằm tận dụng tối đa tiềm năng xử lý của mỗi nút trong hệ thống.

1.4.1.2     Hệ thống điện toán lưới

Điện toán lưới là mô hình tính toán dựa trên mạng để có khả năng xử lý một lượng lớn dữ liệu, một nhóm các máy tính phối hợp với nhau để giải quyết vấn đề chung. Về cơ bản, các máy tính liên kết với nhau để giải quyết một vấn đề chung bằng cách chia thành các đơn vị nhỏ hơn, chúng hình thành một siêu máy tính ảo. Hệ thống điện toán lưới không đòi hỏi tính đồng nhất của tất cả các nút, mỗi thành viên có thể khác về cả phần cứng lẫn hệ điều hành và các chính sách quản lý.

Vấn đề cốt lõi trong hệ thống điện toán lưới là việc quản lý tài nguyên của các cơ quan khác nhau nhưng phải cho phép các nhóm người dùng thuộc các cơ quan cộng tác với nhau, như vậy sự cộng tác đó được thực hiện dựa trên cơ quan ảo, người dùng thuộc về một cơ quan ảo thì có quyền truy nhập đến các tài nguyên của cơ quan ảo đó. Với đặc tính đó, nhiều phần mềm hệ thống điện toán lưới phát triển xung quanh việc truy nhập tài nguyên từ các vùng quản trị khác nhau cho người dùng và  ứng dụng thuộc về một cơ quan ảo, do đó tiêu điểm của hệ thống điện toán lưới thường là những vấn đề liên quan tới mô hình hệ thống.

Hình 1.2 Mô hình phân tầng hệ thống điện toán toán lưới

 

Hình 1.2 thể hiện mẫu mô hình phân tầng thường được ứng dụng trong các hệ thống điện toán lưới, mô hình này bao gồm bốn tầng:

-         Tầng ứng dụng bao gồm các ứng dụng vận hành bên trong cơ quan ảo và sử dụng môi trường điện toán lưới.

-         Tầng tiếp nhận: Xử lý các yêu cầu truy nhập đến nhiều tài nguyên khác nhau, thường cung cấp các chức năng như: thăm dò, định vị, lập lịch truy nhập , nhân bản tài nguyên... Các giao thức thuộc tầng này khá nhiều, để đảm bảo cung cấp dịch vụ theo yêu cầu của tầng ứng dụng nên chúng thường không phải là những giao thức đã được chuẩn hóa.

-         Tầng kết nối: Bao gồm các giao thức truyền thông để hỗ trợ cho các giao tác lưới bao trùm toàn bộ các tài nguyên, ví dụ các giao thức truy cập để di chuyển tài nguyên hoặc đơn giản chỉ là truy cập tài nguyên từ một vị trí nào đó. Tầng kết nối sẽ phải bao gồm các các giao thức bảo mật, tính năng bảo mật có thể cho một tài khoản và cũng có thể cho một ứng dụng.

-         Tầng tài nguyên: Quản lý tài nguyên đơn lẻ, nó sử dụng các chức năng do tầng kết nối cung cấp và gọi trực tiếp các giao diện tầng kết cấu cung cấp để thực hiện các chức năng điều khiển truy nhập, ví dụ các chức năng thiết lập cấu hình tài nguyên, khởi tạo tiến trình đọc/ghi dữ liệu.

-         Tầng thực hiện: Cung cấp giao diện để truy nhập tài nguyên cục bộ, các giao diện này được xây dựng để có thể thích ứng với việc cho phép chia sẻ tài nguyên bên trong một cơ quan ảo, nó thường cung cấp các chức năng để truy vấn trạng thái và khả năng của tài nguyên, các chức năng quản lý tài nguyên thực.

Trong các hệ thống điện toán lưới, tầng tiếp nhận, tầng kết nối và tầng tài nguyên thường được gộp lại và gọi chung là tầng trung gian, nó có nhiệm vụ quản lý và cung cấp chức năng truy nhập trong suốt đến tất cả các tài nguyên phân bố trên các trang mạng khác nhau. Quan sát cho thấy, việc cung cấp các thông tin riêng lẻ trong các hệ thống điện toán khá phổ biến, điều này đã dần dẫn tới quan điểm về mô hình dịch vụ lưới mở.

1.4.2       Hệ thống thông tin phân tán

Một trường hợp khác trong hệ thống phân tán đó là các ứng dụng mạng qui mô lớn, dữ liệu được đặt ở nhiều nơi nhưng việc xử lý ở mỗi nơi liên quan đến những nơi khác.  Trong nhiều trường hợp, các máy chủ chạy tiến trình cung cấp dịch vụ xử lý cho máy khách, máy khách đơn thuần chỉ gửi yêu cầu và nhận về kết quả đã được máy chủ xử lý. Tuy nhiên một yêu cầu đặt ra là cần phải có sự phối hợp xử lý giữa các máy chủ, một yêu cầu được đưa ra từ phía máy khách đến các máy chủ dữ liệu thì yêu cầu đó phải được thực thi trên tất cả các máy chủ hoặc chi cần một máy chủ không thực thi được yêu cầu của máy khách thì tất cả các máy chủ khác cũng không được phép thực thi yêu cầu này.

Hình 1.3 Phần mềm trung gian là phương tiện truyền tin

 

Các phần mềm ngày càng tinh xảo hơn và chúng lần lượt tách chúng thành các thành phần, ví dụ tách biệt thành phần cơ sở dữ liệu  với thành phần xử lý, như vậy việc tích hợp hệ thống phải cho phép các thành phần trao đổi thông tin trực tiếp với nhau, từ đó dẫn đến ngành công nghiệp lớp tích hợp ứng dụng doanh nghiệp. Thực tế, các thao tác thực hiện trong cơ sở dữ liệu thường được thực hiện dưới dạng các giao tác. Phần mềm ứng dụng càng tách biệt với dữ liệu thì càng cần phải có các phương tiên để tích hợp chúng độc lập với cơ sở dữ liệu, đặc biệt các thành phần ứng dụng phải có khả năng trao đổi thông tin trực tiếp với nhau chứ không phải chỉ là những phương tiện hỏi/đáp như trong các hệ thống xử lý giao tác.

1.4.3       Hệ thống lan tỏa

Các hệ thống điện toán phân tán và hệ thống thông tin phân tán đều có hình trạng ổn định, các nút mạng cố định tại một vị trí địa lý và kết nối với nhau qua đường truyền chất lượng cao. Ở một mức độ nào đó, tính ổn định này được thực hiện bằng nhiều kỹ thuật khác nhau nhằm đạt được tính trong suốt phân tán. Việc sử dụng các kỹ thuật che giấu lỗi và phục hồi sẽ cho chúng ta cảm giác thỉnh thoảng mới có một vài lỗi xảy ra. Tương tự như vậy chúng ta cũng có thể che giấu các khía cạnh liên quan đến vị trí các nút trên mạng, nếu lỗi xảy ra trên một nút nào đó thì người dùng và các ứng dụng tin rằng các nút vẫn đang hoạt động.

Tuy nhiên, vấn đề trở nên phức tạp khi xuất hiện các thiết bị di động và thiết bị nhúng, hệ thống sẽ phải đương đầu với tính không ổn định theo nghĩa cả hình trạng lẫn tốc độ truyền dẫn. Các thiết bị trong hệ thống loại này thường là những thiết bị di động với đặc trưng là tính không ổn định về vị trí cũng như tốc độ truyền dẫn. Hệ thống này thiếu vắng sự kiểm soát nhân công, cấu hình của các thiết bị do chủ sở hữu thiết bị qui định, nếu không thì thiết bị sẽ tự động khám phá môi trường và lựa chọn cấu hình phù hợp nhất. Để sự lựa chọn được chính xác nhất, Grimm đã đưa ra các yêu cầu sau cho các hệ thống lan tỏa phân tán:

-         Bao quát những thay đổi ngữ cảnh: Thiết bị phải liên tục nhận biết được môi trường có thể thay đổi bất kỳ thời gian nào, ví dụ khi phát hiện thấy mất kết nối mạng thì thiết bị sẽ tự động tìm mạng khác thay thế.

-         Cung cấp giao diện cấu hình mặc định: Mỗi người dùng có thói quen riêng biệt, do đó cần phải cung cấp giao diện cấu hình sao cho đơn giản nhất phù hợp với tất cả mọi người hoặc một cấu hình được cài đặt tự động.

-         Tự động nhận biết chia sẻ tài nguyên: Một khía cạnh quan trọng của hệ thống lan tỏa là các thiết bị tham gia hệ thống theo thứ tự truy nhập thông tin, điều này đòi hỏi phải cung cấp các phương tiện để dễ dàng đọc, lưu trữ, quản lý và chia sẻ thông tin. Với quan niệm việc kết nối mạng của các thiết bị thường gián đoạn hoặc thay đổi thì không gian lưu trữ thông tin có thể truy nhập được cũng sẽ phải thay đổi theo thời gian. Với sự hiện diện của khả năng di động thì các thiết bị phải dễ dàng thích nghi với môi trường cục bộ, chúng phải có khả năng dễ dàng phát hiện các dịch vụ và phản hồi theo các dịch vụ đó. Sự trong suốt về mặt phân bố không chỉ ở trong hệ thống lan tỏa mà thực tế còn ở sự phân bố về dữ liệu, xử lý và điều khiển, vì lẽ đó tốt hơn hết là phải phơi bày chứ không nên che giấu chúng.

Cùng với sự phát triển Internet vạn vật (IOT), hệ thống lan tỏa phát triển ngày càng mạnh mẽ, ví dụ hệ thống thiết bị trong gia dụng, hệ thống chăm sóc sức khỏe, mạng cảm biến..., khó có thể yêu cầu người dùng cài đặt phần mềm trên những thiết bị này, chúng phải được thiết kế sao cho có thể tự động nhận biết được môi trường xung quanh. Lượng dữ liệu thu được từ các thiết bị này rất lớn, giải pháp lắp đặt cho mỗi thiết bị một bộ lưu trữ lên tới vài TB là không khả thi, cho dù có giải quyết được vấn đề lưu trữ thì vẫn gặp phải một loạt những vấn đề khác, tùy từng hệ thống cần phải xem xét các vấn đề sau:

-         Bảo mật tính riêng tư của thông tin

-         Dữ liệu được lưu trữ ở đâu và bằng cách nào có thể khai thác được chúng

-         Các biện pháp phòng chống mất mát dữ liệu quan trọng

-         Hạ tầng cần thiết để tạo và lan tỏa các cảnh báo

-         Phương pháp phản hồi và kiểm soát trực tuyến các thiết bị

-         Sử dụng giải pháp nào để triển khai một lượng rất lớn các thiết bị

-         Giải pháp khắc phục khi gặp sự cố về đường truyền mạng

Đối với các thiết bị gia dụng, vấn đề ưu tiên hàng đầu là các thiết bị phải có khả năng tự cấu hình quản lý và tính riêng tư của thông tin, hệ thống chăm sóc sức khỏe lại đặt vấn đề cảnh báo và phản hồi trực tuyến là quan trọng, trong khi đó hệ thống cảm biến lại phải đương đầu với số lượng rất lớn các thiết bị.

1.4.4       Điện toán đám mây

Điện toán đám mây là xu hướng công nghệ quan trọng, đó là một trong những thay đổi quan trọng nhất trong cách xây dựng các hệ thống thông tin, bản chất của nó là cung cấp các dịch vụ tiện ích dựa trên nền tảng điện toán lưới. Ý tưởng về điện toán đám mây đã được Jcr Licklider đề xuất trong một bài báo về “mạng máy tính giữa các thiên hà” vào năm 1969, chỉ đến khi Internet băng thông rộng phát triển mạnh mẽ  thì điện toán đám mây mới có những thành tựu đáng kể. Một trong những cột mốc đầu tiên cho điện toán đám mây là sự xuất hiện của Salesforce.com vào năm 1999, tiên phong trong khái niệm các ứng dụng doanh nghiệp cung cấp thông qua một trang web đơn giản. Sự phát triển tiếp theo là Amazon Web Services vào năm 2002, trong đó cung cấp một bộ các dịch vụ dựa trên đám mây bao gồm lưu trữ, tính toán và ngay cả trí tuệ nhân tạo thông qua Amazon Mechanical Turk. Năm 2006, Amazon ra mắt điện toán đám mây Elastic Compute là một dịch vụ web thương mại cho phép các công ty nhỏ, cá nhân thuê máy tính mà trên đó để chạy các ứng dụng máy tính của mình. Năm 2009 đánh dấu một bước tiến triển lớn, Google và các công ty khác bắt đầu cung cấp các ứng dụng doanh nghiệp dựa trên trình duyệt, dịch vụ như Google Apps.

Về cơ bản, điện toán đám mây và điện toán lưới khá tương đồng với nhau, cả hai đều cung cấp dịch vụ cho người dùng bằng cách chia sẻ tài nguyên của mình để thực hiện các tác vụ khác nhau. Tuy nhiên hai loại này cũng có những điểm khác biệt cơ bản, trong khi điện toán lưới ảo hóa các tài nguyên tính toán lưu trữ dữ liệu thì điện toán đám mây không cho phép người dùng truy nhập trực tiếp vào tài nguyên, việc truy nhập được thực hiện thông qua các dịch vụ trên nền tảng Internet. Điện toán lưới chia một tác vụ thành nhiều tác vụ nhỏ hơn để thực hiện trên các máy tính khác nhau, điện toán đám mây tạo ra một thể hiện mới cho người dùng với tài nguyên riêng bằng cách cung cấp dịch vụ cho người dùng đó. Điện toán lưới là tập các tài nguyên máy tính từ nhiều vị trí khác nhau để xử lý một tác vụ,  đó là một hệ thống chia sẻ tài nguyên cộng tác, các tài nguyên được quản lý phân tán. Điện toán đám mây là một dạng tính toán dựa trên tài nguyễn đã ảo hóa, đặt ở các vị trí khác nhau trong một cụm và được quản lý tập trung.

1.5        Mục tiêu hệ thống phân tán

Không cần hệ thống phân tán vẫn có thể trao đổi thông tin, đơn giản chỉ cần sao chép dữ liệu vào đĩa và chuyển sang máy tính khác, tuy nhiên công việc đó không còn hợp với thời đại khi mạng máy tính đã hiện diện ở khắp mọi nơi. Giờ đây, người sử dụng chỉ cần ngồi trước một máy tính hoặc sử dụng điện thoại thông minh để trao đổi thông tin tới mọi nơi trên thế giới. Cũng giống như các phần mềm khác, khi sử dụng các dịch vụ của hệ thống phân tán người sử dụng luôn mong muốn có được các phần mềm thân thiện, tốc độ xử lý nhanh, dễ dàng cá nhân hóa các chức năng và đảm bảo an toàn thông tin. Vì vậy khi thiết kế hệ thống phân tán cần phải đảm bảo các mục tiêu sau:

-         Thân thiện với người dùng: Tính thân thiện không những thể hiện ở giao diện thuận lợi nhất mà còn phải đáp ứng các yêu cầu về thông tin cho người dùng. Hệ thống phải đảm bảo tính tin cậy, thông tin phải chính xác và luôn sẵn sàng đáp ứng yêu câu của người dùng.

-         Hiệu năng hệ thống: Phải đảm bảo thời gian đáp ứng khi người dùng đưa ra yêu cầu, nó không phụ thuộc vào qui mô về không gian cũng như số lượng người dùng. Cần chú ý đưa ra các giải pháp hạn chế tối đa độ trễ trên các kênh truyền vật lý, khắc phục hiện tượng nút cổ chai hoặc nghẽn mạng.

-         Linh hoạt: Dễ dàng thay đổi dịch vụ, có khả năng mở rộng và di chuyển các thành phần cấu thành hệ thống phân tán, tính chuyên môn hóa cao và khả năng tương tác tốt giữa các thành phần trong hệ thống cũng như các hệ thống phân tán khác.

-         Nhất quán: Thống nhất trong việc sử dụng dịch vụ, dữ liệu trên toàn hệ thống. Dữ liệu có thể phân tán ở nhiều vị trí khác nhau, việc xử lý có thể thực hiện trên các máy tính khác nhau nhưng luôn phải đảm bảo tính nhất quán cho người dùng.

-         Chịu lỗi: Khi gặp lỗi, hệ thống có thể tự khởi tạo lại trạng thái tốt nhất và đồng thời đảm bảo không mất mát thông tin, ở mức độ cao hơn hệ thống có thể tự xử lý các trường hợp lỗi.

-         An toàn và bảo mật thông tin: thông tin đáng tin cậy, tránh mất mát và lộ thông tin của người dùng,  bảo vệ tốt hệ thống kiểm soát truy nhập để đảm bảo an ninh và an toàn cho hệ thống.

Mục tiêu quan trọng nhất của hệ thống phân tán là đảm bảo khả năng sẵn sàng của tài nguyên cho các dịch vụ, làm sao để người sử dụng có thể tiếp cận các tài nguyên đó một cách thuận tiện nhất. Hệ thống phân tán phải đảm bảo tính trong suốt, nghĩa là người sử dụng không cần quan tâm tới những thao tác xử lý bên trong mà chỉ cần quan tâm đến kết quả yêu cầu và những yêu cầu đó phải được thực hiện chính xác trong thời gian ngắn nhất có thể. Tiếp theo là những mục tiêu mang tính chất kỹ thuật, hệ thống phải có khả năng mở rộng về qui mô, có khả năng chịu lỗi,  khả năng bảo mật cao, dễ dàng nâng cấp và bảo trì hệ thống.

1.5.1    Đảm bảo khả năng sẵn sàng của tài nguyên 

Mục tiêu chính của hệ thống phân tán là kết nối người sử dụng với tài nguyên hệ thống, người sử dụng được tiếp cận tài nguyên theo cách dễ dàng nhất mà không phụ thuộc vị trí địa lý của người đó. Tài nguyên ở đây có thể hiểu mọi thứ có thể chia sẻ hoặc cung cấp dịch vụ, đó có thể là tài nguyên phần cứng như máy in, máy tính, các phương tiện lưu trữ..., và cũng có thể đó là những dữ liệu cung cấp thông tin hữu ích cho người sử dụng. Có nhiều lý do muốn chia sẻ tài nguyên, lý do rõ ràng nhất là vì mục tiêu kinh tế, người sử dụng có thể chia sẻ phần cứng để tiết kiệm chi phí. Lý do thứ hai đó là nhu cầu trao đổi thông tin, đó có thể là những thông tin cộng tác trong công việc hoặc có thể là những thông tin phục vụ cho giải trí. Với việc phát triển mạnh mẽ của mạng Internet, các hệ thống thương mại điện tử ngày càng mở rộng, người sử dụng có thể thực hiện các công việc mà không nhất thiết phải hiện diện tại nơi làm việc.

 Tuy nhiên, khi  nhu cầu kết nối và chia sẻ tài nguyên ngày càng tăng thì vấn đề bảo mật càng trở nên quan trọng, như vậy nảy sinh hàng loạt vấn đề liên quan đến việc khai thác và sử dụng tài nguyên như ai được phép truy nhập, mức độ truy nhập, thời gian được phép truy nhập, tần suất truy nhập …. Thực tế cho thấy các hệ thống ít được bảo vệ chống lại những hiểm họa nghe trộm hoặc xâm nhập dữ liệu được gửi trên mạng, không mã hóa mật khẩu và thường lưu trong máy tính. Xét về khía cạnh bảo mật sẽ có rất nhiều công việc cần phải thực hiện, ví dụ các giao dịch thương mại điện tử người sử dụng chỉ cần nhập vào số hiệu thẻ tín dụng, lẽ tất nhiên sẽ cần thiết phải chứng minh đó thực sự là chủ sở hữu thẻ. Một vấn đề bảo mật khác là việc lưu vết truyền thông để xây dựng hồ sơ thói quen của người sử dụng, điều này vi phạm tính riêng tư và nó đặc biệt nghiêm trọng nếu như không thông báo cho người sử dụng. Việc các thông tin rác trên mạng cũng gây khó chịu cho người sử dụng, như vậy cần phải thiết kế hệ thống sao cho có thể  lọc được những thông tin dựa trên nội dung nhưng không ảnh hưởng đến mục tiêu đảm bảo tính sẵn sàng tài nguyên của hệ thống.

1.5.2    Trong suốt đối với người sử dụng

Mục tiêu quan trọng của hệ thống phân tán là che giấu sự thật các tiến trình và tài nguyên phân tán trên nhiều máy tính, một hệ thống phân tán có thể tự trình diễn cho người dùng và các ứng dụng như thể đang chạy trên một máy tính, đó gọi là tính trong suốt. Tính trong suốt đối với người sử dụng nhằm che giấu vị trí thực của tài nguyên, người sử dụng không biết tài nguyên ở đâu và xử lý trên máy tính nào. Hệ thống phân tán gồm nhiều loại trong suốt, người thiết kế hệ thống cần phải trả lời cho câu hỏi cần thiết phải trong suốt hay không và nếu có thì trong suốt ở mức độ nào.

1.5.2.1     Phân loại tính trong suốt

Tính trong suốt của hệ thống phân tán có thể được áp dụng cho nhiều khía cạnh, theo tiêu chuẩn của ISO 1995 tính trong suốt bao gồm các vấn đề sau:

-         Truy nhập: Che giấu việc thể hiện dữ liệu và cách truy nhập tài nguyên.

-         Vị trí: Che giấu nơi đặt tài nguyên của hệ thống.

-         Di trú: Che giấu việc tài nguyên có thể di chuyển sang vị trí khác, khi đặt lại vị trí tài nguyên không làm gián đoạn hoạt động của hệ thống.

-         Nhân bản: Che giấu nhân bản tài nguyên.

-         Tương tranh: Che giấu việc chia sẻ tài nguyên cho nhiều người đồng thời sử dụng.

-         Lỗi: Che giấu lỗi và vấn đề phục hồi sau khi lỗi xảy ra.

Trong suốt về truy nhập giải quyết vấn đề che giấu những điểm khác biệt trong việc thể hiện và cách thức người sử dụng có thể truy nhập đến tài nguyên. Ở mức cơ bản cần phải che giấu những điểm khác biệt trong kiến trúc của các máy, nhưng điều quan trọng hơn là phải đạt được sự đồng thuận về cách thể hiện trên các nền tảng khác nhau. Ví dụ hệ thống phân tán không đồng nhất gồm nhiều máy tính cài đặt các hệ điều hành khác nhau, qui tắc đặt tên cho các tập tin cho mỗi loại hệ điều hành tất nhiên cũng sẽ khác nhau, như vậy cần phải che giấu những điểm khác biệt này đối với người sử dụng. Trong suốt về vị trí thực chất là che giấu người sử dụng nơi thực sự đặt tài nguyên, việc đặt tên đóng vai trò rất quan trọng để đạt được sự trong suốt về vị trí. Việc gán các tên logic cho tài nguyên và được công khai nhưng vẫn đảm bảo tính bí mật vị trí của tài nguyên, ví dụ đường dẫn http://www.ptit.edu.vn không thể hiện bất kỳ thông tin nào về vị trí của máy chủ đang đặt trang web.

Tài nguyên có thể di chuyển trong hệ thống phân tán mà không ảnh hưởng tới việc truy nhập thì có thể nói rằng hệ thống đã đảm bảo tính trong suốt về di trú, thậm chí hệ thống có tính trong suốt về định vị lại vị trí nếu tài nguyên chuyển sang vị trí khác trong khi người sử dụng đang truy nhập mà không hề bị gián đoạn. Ví dụ mạng di động, người sử dụng có thể di chuyển trong khi vẫn đang thực hiện các giao dịch mà không hề bị mất kết nối mạng, điều này càng chứng tỏ vai trò quan trọng của tính trong suốt về đặt lại vị trí trong các hệ thống phân tán. Để tăng tính sẵn sàng của tài nguyên hoặc tăng hiệu năng hệ thống người ta có thể áp dụng kỹ thuật nhân bản tài nguyên, làm cho tài nguyên đến gần vị trí truy nhập hơn, tính trong suốt trong nhân bản giải quyết sự thật tồn tại nhiều bản sao của tài nguyên. Để che giấu việc nhân bản thì các bản sao phải cùng tên, như vậy hệ thống cũng phải hỗi trợ tính trong suốt về vị trí, nếu không sẽ không thể tham chiếu đến các bản sao tại những vị trí khác nhau.

Một trong những mục tiêu quan trọng của hệ thống phân tán là cho phép chia sẻ tài nguyên, trong nhiều trường hợp những tài nguyên đó phải được chia sẻ theo cách cộng tác, nghĩa là phải cho phép nhiều người đồng thời sử dụng tài nguyên. Ví dụ cho phép chia sẻ đường truyền, chia sẻ tập tin và dữ liệu trên các máy chủ..., những trường hợp đó điều quan trọng không được phép thông báo cho người sử dụng tài nguyên đang bận, hiện tượng này gọi là trong suốt về tương tranh. Một vấn đề trong truy nhập tương tranh đến tài nguyên chia sẻ phát sinh trạng thái nhất quán, có thể đạt được tính nhất quán thông qua cơ chế khóa, nghĩa là người sử dụng sẽ được cấp quyền truy nhập duy nhất được phép sử dụng tài nguyên, điều này dẫn tới khái niệm quản lý giao tác trong các hệ thống phân tán.

Một vấn đề quan trọng khác trong hệ thống phân tán liên quan đến việc xử lý lỗi, người sử dụng không cần biết lỗi gì đã xảy ra mà chỉ cần quan tâm đến yêu cầu của họ có thực hiện đúng hay không. Làm cho hệ thống phân tán trong suốt về lỗi nghĩa là không cần phải thông báo cho người sử dụng biết đã có lỗi xảy ra và cách phục hồi như thế nào, che giấu lỗi là một trong những vấn đề khó khăn nhất của hệ thống phân tán và thậm chí không thể thực hiện được nếu như hệ thống không lường hết các tình huống lỗi. Khó khăn chính trong việc che giấu lỗi nằm ở chỗ không có khả năng phân biệt giữa việc không thể truy nhập tài nguyên và truy nhập tài nguyên chậm, ví dụ trình duyệt gửi yêu cầu đến máy chủ web nhưng quá thời gian vẫn không thấy trả lời, trình duyệt sẽ thông báo lỗi không có trang web, như vậy người sử dụng không thể kết luận lỗi đã xảy ra trên máy chủ hay mất kết nối mạng.

1.5.2.2     Mức độ trong suốt

Mặc dù tính trong suốt được xem như một trong những mục tiêu của hệ thống phân tán, tuy nhiên trong nhiều trường hợp sự che giấu quá mức không phải là điều tốt. Ví dụ điển hình là định dạng hiển thị thời gian, một số nước sử dụng định dạng DD/MM/YYYY nhưng cũng rất nhiều nước sử dụng định dạng MM/DD/YYYY. Tương tự như vậy, các hệ thống phân tán dựa trên nền tảng của mạng máy tính, độ trễ của mạng bao gồm trễ truyền dẫn và trễ xử lý trên các thiết bị mạng, do đó việc trao đổi thông tin giữa các máy tính chắc chắn sẽ cần một khoảng thời gian nhất định. Tính trong suốt càng cao thì đòi hỏi hệ thống phải xử lý càng nhiều, điều này có thể dẫn tới sự suy giảm hiệu năng của hệ thống, do đó cần phải cân đối giữa mức độ trong suốt và hiệu năng. Ví dụ, trong các hệ thống thông tin phân tán, mỗi cập nhật thực hiện trên một bản sao thì sẽ phải lan tỏa đến tất cả các bản sao khác, như vậy để đảm bảo tính nhất quán sẽ thì thời gian thực hiện sẽ lâu hơn, điều này không nên che giấu người sử dụng, có thể hiển thị thông báo giao dịch đang được thực hiện hoặc thời gian dự kiến hoàn thành để người sử dụng yên tâm chờ đợi. Một ví dụ khác, khi người sử dụng muốn in một tập tin, nên để người sử dụng chọn máy in nào, không nên để hệ thống phân tán tìm kiếm máy in nào đang rỗi để gửi yêu cầu in.

Ví dụ cuối cùng là trường hợp hệ thống nhân bản nhưng có một bản sao nằm trên thiết bị của người sử dụng, thông thường bản sao trên thiết bị của người sử dụng và bản sao trên máy chủ của hệ thống phân tán phải được đồng bộ với nhau, tuy nhiên vì nhiều lý do những dữ liệu này chưa được đồng bộ, vì vậy không nên che giấu người sử dụng những tình huống này. Cũng có ý kiến cho rằng không nên che giấu người sử dụng, khó có thể đạt được sự trong suốt hoàn toàn với người sử dụng cho nên sẽ tốt hơn nếu phơi bày các vấn đề cho người sử dụng biết để người sử dụng hiểu và có biện pháp chủ động xử lý. Tuy nhiên điều này lại ảnh hưởng đến tính thân thiện của hệ thống đối với người sử dụng. Như vậy tính trong suốt là mục tiêu rất quan trọng khi thiết kế và cài đặt hệ thống phân tán nhưng cần phải xem xét vấn đề hiệu năng và tính dễ hiểu cho người sử dụng, để đạt được tính trong suốt hoàn toàn có thể sẽ phải chi phí rất cao trong việc xử lý bên trong hệ thống.

1.5.3    Tính mở của hệ thống

Tính mở của hệ thống phân tán là khả năng cung cấp các dịch vụ theo qui tắc chuẩn mô tả cú pháp và ngữ nghĩa của các dịch vụ. Như vậy để đạt mục tiên hệ thống có tính mở thì phải tuân thủ các chuẩn giao tiếp đã được công bố, nghĩa là sản phẩm của các nhà sản xuất khác nhau có thể tương tác với nhau theo tập các luật và các qui tắc đã được chuẩn hóa. Ví dụ trong mạng máy tính, các qui tắc chuẩn đề ra định dạng, nội dung và ý nghĩa của các thông điệp gửi và nhận, những qui tắc như vậy gọi là giao thức. Trong hệ thống phân tán, các dịch vụ thường được mô tả bằng ngôn ngữ định nghĩa giao diện, nó thể hiện cú pháp của các dịch vụ, nghĩa là xác định chính xác tên của các hàm cùng với các tham số và giá trị trả về, thậm chí mô tả cả các trường hợp lỗi có thể xảy ra. Khó khăn nằm ở việc mô tả chính xác các dịch vụ đó làm gì, đó là ngữ nghĩa của các giao diện, trong thực tế những đặc tính kỹ thuật này được công bố không chính thức dưới hình thức ngôn ngữ tự nhiên. Nếu mô tả chính xác, định nghĩa giao diện sẽ cho phép tiến trình bất kỳ có thể tương tác với tiến trình cung cấp giao diện này, nó cũng cho phép các bên thực hiện cài đặt các giao diện hoàn toàn khác nhau nhưng chúng vận hành giống hệt nhau.

Các đặc tả chính xác phải đầy đủ và trung lập, tính đầy đủ thể hiện tất cả những việc cần phải thực hiện đều được xác định rõ ràng, tuy nhiên nhiều đặc tả chưa hoàn toàn đầy đủ và như vậy người phát triển phải thêm những chi tiết, tính trung lập thể hiện các đặc tả không qui định cách cài đặt cụ thể cho mỗi giao diện. Cả hai đặc tính này rất quan trọng để hệ thống có khả năng tương thích và khả năng dễ dàng chuyển đổi, khả năng tương thích thể hiện việc cài đặt các thành phần của những nhà sản xuất khác nhau có thể cùng làm việc chỉ dựa trên các dịch vụ của nhau như đã mô tả trong các tiêu chuẩn chung. Khả năng dễ dàng chuyển đổi đặc trưng cho mức độ mà người phát triển trên các hệ thống khác nhau có thể tùy biến cùng một dịch vụ đã cung cấp. Một mục tiêu khác của tính mở trong hệ thống phân tán là khả năng dễ dàng cấu hình hệ thống từ các thành phần khác nhau, có thể dễ dàng thêm thành phần mới hoặc thực hiện những thao tác sửa đổi nhưng không ảnh hưởng đến các thành phần khác, mục tiêu này gọi là khả năng mở rộng của hệ thống. Một hệ thống có khả năng mở rộng nghĩa là có thể tương đối dễ dàng thêm các phần chạy trên những hệ điều hành khác nhau, hoặc thậm chí có thể thay thế toàn bộ hệ thống. Những đặc điểm này đặc trưng cho tính linh hoạt của hệ thống, tất nhiên thực tế cho thấy việc đề ra những mục tiêu như vậy rất dễ nhưng để thực hiện các mục tiêu đó lại là chuyện khác.

Để đạt được tính linh hoạt trong các hệ thống phân tán mở thì hệ thống phải được tổ chức thành tập các thành phần tương đối nhỏ, dễ thay thế hoặc tương thích, điều này ngụ ý không chỉ cung cấp định nghĩa cho các giao diện mức cao nhất mà còn phải cung cấp định nghĩa cho những thành phần bên trong của hệ thống và mô tả chính xác các thành phần đó tương tác với nhau như thế nào. Cách tiếp cận này tương đối mới, nhiều hệ thống cũ và ngay cả những hệ thống hiện nay đều được xây dựng dựa trên cách tiếp cận khối, nghĩa là các thành phần tách biệt nhau về mặt logic nhưng lại được cài đặt trong một chương trình lớn, với cách tiếp cận này thì khó có thể thay thế hoặc thích nghi thành phần mà không ảnh hưởng đến toàn bộ hệ thống, các hệ thống như vậy có xu thế đóng chứ không có tính mở. Nguyên nhân phải thay đổi hệ thống phân tán thường là do các thành phần không cung cấp chính sách tối ưu cho người sử dụng hoặc cho ứng dụng, điều cần thiết là phải tách biệt giữa chính sách với các cơ chế thực hiện, cần thiết phải triển khai các tham số để người sử dụng có thể tùy biến.

1.5.4    Qui mô hệ thống

Kết nối qua mạng Internet đã và đang nhanh chóng phủ khắp mọi hoạt động trên toàn thế giới, như vậy qui mô hệ thống là một trong những mục tiêu quan trọng nhất trong thiết kế hệ thống phân tán. Qui mô của một hệ thống có thể đo bằng ba tiêu chí, tiêu chí thứ nhất là có thể mở rộng hệ thống nhưng vẫn dựa trên hạ tầng hiện có, nghĩa là có thể dễ dàng thêm người sử dụng và tài nguyên vào hệ thống nhưng không cần đầu tư thêm trang thiết bị. Hệ thống phân tán cần phải đảm bảo dễ dàng thêm các máy tính mà không cần bất kỳ sửa đổi nào, số lượng máy tính và số lượng người sử dụng tăng thêm, như vậy chúng ta có thể mở rộng hay thu hẹp hệ thống phân tán theo nhu cầu thực tế, đây là tiêu chí quan trọng nhất trong thiết kế qui mô của hệ thống phân tán. Tiêu chí thứ hai là hệ thống có thể mở rộng theo phạm vi địa lý, nghĩa là người sử dụng và tài nguyên có thể nằm cách xa nhau nhưng ít ảnh hưởng tới hiệu suất hoạt động của hệ thống. Cả hai trường hợp mở rộng trên cần phải bảo đảm khả năng quản trị hệ thống và đó cũng là tiêu chí thứ ba, hệ thống có thể mở rộng qui mô quản trị,  vẫn có thể dễ dàng quản trị hệ thống dù cho công việc quản trị này có thể do nhiều đơn vị quản trị độc lập thực hiện. Rất tiếc, hệ thống mở rộng theo một hoặc cả ba tiêu chí trên thường làm suy giảm hiệu năng hệ thống, cân bằng giữa hiệu năng và qui mô cũng là vấn đề cần phải xem xét kỹ lưỡng.

1.5.4.1     Các vấn đề liên quan đến qui mô hệ thống

Khi cần phải mở hệ thống thì cần phải giải quyết một loạt vấn đề, ví dụ khi mở rộng qui mô nhưng vẫn dựa trên nền tảng hiện hành, nếu cần phải hỗ trợ nhiều người dùng hoặc nhiều tài nguyên hơn thì phải đương đầu với những giới hạn của các dịch vụ, dữ liệu và các giải thuật tập trung. Các dịch vụ tập trung được cài đặt trên một máy chủ, rõ ràng hiện tượng nghẽn cổ chai có thể xảy ra, dù cho năng lực xử lý và lưu trữ của máy chủ rất lớn thì băng thông kết nối đến máy chủ cũng là trở ngại lớn cho việc mở rộng qui mô. Rất tiếc việc sử dụng một máy chủ đôi khi không thể tránh được, ví dụ các dịch vụ quản lý thông tin mức độ bí mật cao như tài khoản ngân hàng, thuê bao điện thoại…, những trường hợp này nên đặt máy chủ tại nơi được bảo vệ nghiêm ngặt và tách khỏi các bộ phận khác của hệ thống phân tán, tạo bản sao tại vài vị trí để nâng cao hiệu năng có thể không vướng mắc vấn đề gì nhưng lại làm cho tính bảo mật của dịch vụ kém hơn.

Lưu trữ dữ liệu tập trung cũng tồi không kém gì các dịch vụ tập trung, có thể đáp ứng không gian lưu trữ cho hàng triệu bản ghi nhưng chắc chắn đường truyền đến máy chủ cũng sẽ bị bão hòa khi có nhiều người đồng thời truy nhập. Ví dụ hệ thống phân giải tên miền, cơ sở dữ liệu lưu trữ tên và địa chỉ của các máy chủ trên toàn mạng Internet, nếu tập trung dữ liệu trên một máy chủ chắc chắn sẽ gây ra hiện tượng tắc nghẽn. Cuối cùng là vấn đề giải thuật tập trung, ví dụ bài toán định tuyến trên mạng, dưới góc độ lý thuyết có thể tìm ra đường đi tối ưu bằng cách thu thập thông tin về tải trên tất cả các máy và các kênh truyền sau đó tính toán tuyến đường tối ưu, đây quả thực là một ý tưởng rất tốt nhưng thực thi nó thì lại rất tồi. Thông in về tải có thể lan truyền trên toàn bộ hệ thống để cải thiện vấn đề định tuyến, khó khăn ở chỗ việc thu thập và vận chuyển các thông điệp này lại làm tăng tải cho mạng. Thực tế cho thấy nên tránh các giải thuật thu thập thông tin từ nhiều nút để tính toán sau đó gửi kết quả cho các nút khác, nên thay thế bằng các giải thuật phi tập trung. Khác với giải thuật tập trung, các giải thuật không tập trung thường có những đặc điểm sau:

-         Không một máy tính nào có đầy đủ thông tin về trạng thái hệ thống.

-         Các máy tính ra quyết định chỉ dựa trên thông tin cục bộ.

-         Lỗi xảy ra trên một máy sẽ không ảnh hưởng đến các máy khác và do đó không làm hỏng giải thuật

-         Không tồn tại đồng hồ chung cho toàn bộ hệ thống

Đặc điểm thứ tư sẽ được đề cập chi tiết trong một chương riêng, các giải thuật càn phải tôn trọng sự thật không thể đồng bộ chính xác thời gian giữa các máy tính trong hệ thống phân tán. Trong phạm vi mạng cục bộ, việc đồng bộ thời gian có thể đạt chính xác đến vài µs, nhưng điều này sẽ không thể đạt được trên mạng diện rộng, sẽ rất mạo hiểm nếu sử dụng đồng hồ quốc gia hay đồng hồ quốc tế.

Qui  mô về địa lý chứa đựng vấn đề riêng của nó, một trong những lý do chính rất khó mở rộng qui mô về địa lý cho những hệ thống phân tán được thiết kế chạy trong mạng cục bộ là do chúng dựa trên phương pháp truyền thông đồng bộ, nghĩa là tiến trình trên máy khách sẽ bị phong tỏa trong thời gian chờ kết quả trả về từ tiến trình trên máy chủ. Giải pháp này nói chung sẽ vận hành tốt trong mạng cục bộ, nơi mà truyền thông giữa các máy tính chỉ vài µs. Vấn đề sẽ hoàn toàn khác khi áp dụng cho mạng diện rộng, truyền thông liên tiến trình có thể kéo dài tới hàng trăm ms, nghĩa là chậm hơn hàng ngàn lần so với mạng cục bộ, do đó xây dựng các ứng dụng tương tác trong mạng diện rộng đòi hỏi phải nỗ lực rất lớn và cần thiết sự kiên nhẫn để tìm ra hướng giải quyết các vấn đề phát sinh.

Một vấn đề lớn khác cản trở việc mỏ rộng qui mô địa lý là vấn đề không tin cậy trong các mạng diện rộng, và hầu như chỉ thực hiện được các kết nối điểm-điểm chứ không áp dụng được phương pháp quảng bá hoặc truyền tin theo nhóm. Ví dụ vấn đề xác định dịch vụ trong mạng cục bộ chỉ cần quản bá thông điệp đến các máy để hỏi xem có chạy dịch vụ hay không, chỉ những máy cung cấp dịch vụ mới trả lời, cách làm này chắc chắn không áp dụng được cho mạng diện rộng, như vậy sẽ phải thiết kết dịch vụ định vị đáp ứng yêu cầu cho hàng tỉ người sử dụng trên toàn thế giới.

Qui mô về địa lý cũng liên quan mạnh mẽ tới các vấn đề của giải pháp tập trung, chúng đều gây trở ngại cho việc mở rộng, nếu hệ thống gồm nhiều thành phần tập trung thì qui mô về địa lý sẽ bị giới hạn về hiệu năng và những vấn đề tin cậy phát sinh trong truyền thông trên mạng diện rộng. Hơn nữa, các thành phần tập trung sẽ dẫn đến sự lãng phí tài nguyên mạng, tương tác của người sử dụng với máy chủ sẽ phải đi qua nhiều thiết bị định tuyến, rõ ràng việc xử lý tập trung sẽ không thể đáp ứng yêu cầu mở rộng qui mô về địa lý.

Câu hỏi cuối cùng khá phức tạp, đó là làm sao có thể mở rộng hệ thống phân tán cho nhiều miền quản lý độc lập, vấn đề chính cần giải quyết là mâu thuẫn về chính sách đối với việc sử dụng tài ngyên, đó có thể là chính sách về thanh khoản và quản lý hay vấn đề bảo mật. Ví dụ về chính sách bảo mật, người sử dụng có thể tin cậy vào các thành phần của hệ thống phân tán thuộc cùng một miền quản lý, quản trị hệ thống có thể kiểm tra và chứng nhận cho các ứng dụng và thậm chí có thể thực hiện các biện pháp đặc biệt để bảo đảm các thành phần không bị giả mạo, tuy nhiên niềm tin này sẽ không thể mở rộng ra ngoài vùng quản lý. Nếu hệ thống phân tán mở rộng sang vùng khác thì phải thực hiện hai biện pháp bảo mật, thứ nhất phải tự bảo vệ chống lại tấn công phá hoại từ vùng mới, người sử dụng của vùng mới có thể chỉ được cấp quyền đọc tài nguyên, thậm chí không cấp quyền truy nhập đến một số tài nguyên cho người ngoài. Thứ hai, vùng mới cũng phải tự bảo vệ trước các cuộc tấn công phá hoại nhưng vẫn phải đảm bảo cấp quyền truy nhập cho người sử dụng thuộc vùng hiện hành.

1.5.4.2     Các kỹ thuật xử lý qui mô hệ thống

Vấn đề qui mô hệ thống phức tạp, nhưng quan trọng hơn cần phải trả lời câu hỏi bằng cách nào có thể giải quyết những vấn đề này, hầu hết các trường hợp đều dẫn đến vấn đề về hiệu năng trong điều kiện hạn hẹp về năng lực của mạng và các máy chủ. Về cơ bản sẽ có ba kỹ thuật để mở rộng qui mô, đó là các kỹ thuật che giấu trễ truyền thông, kỹ thuật phân tán và kỹ thuật nhân bản. Che giấu trễ truyền thông đóng vai trò quan trọng trong việc mở rộng qui mô về địa lý, thực chất đơn giản chỉ là tránh chờ đợi kết quả trả về từ các dịch vụ từ xa càng nhiều càng tốt, nghĩa là bên gửi yêu cầu sẽ sử dụng thời gian chờ đợi cho những công việc hữu ích. Như vậy, chỉ có thể áp dụng cơ chế truyền thông không đồng bộ mới giải quyết được vấn đề này, ngay khi nhận được kết quả trả về sẽ tạm ngừng mọi công việc đang thực hiện để tiếp tục xử lý yêu cầu đã gửi trước đó.

Truyền thông không đồng bộ thường được sử dụng trong các hệ thống xử lý lô và trong các ứng dụng xử lý song song, trong đó có thể lập lịch thực thi cho các nhiệm vụ độc lập trong khi chờ đợi hoàn thành truyền thông. Hoặc giả có thể khởi tạo một luồng mới để thực hiện yêu cầu, mặc dù nó bị phong tỏa để chờ kết quả trả về nhưng luồng khác của tiến trình vẫn có thể tiếp tục thực hiện. Tuy nhiên nhiều ứng dụng không thể thực hiện hiệu quả truyền thông không đồng bộ, ví dụ trong các ứng dụng tương tác, người sử dụng sau khi gửi yêu cầu nói chung sẽ không làm gì hơn ngoài việc chờ đợi kết quả trả về. Trong những trường hợp này, giải pháp tốt nhất là giảm thiểu truyền thông, nghĩa là phải giảm tối đa thời gian xử lý trên máy chủ cũng như lượng dữ liệu di chuyển trên mạng, ví dụ có thể chuyển một số chức năng xử lý trên máy chủ về máy khách.

Hình 1.4 Thực hiện tiền xử lý trên máy khách

Trường hợp điển hình có thể thấy là các yêu cầu truy nhập cơ sở dữ liệu sử dụng cửa sổ trên máy khách, thông tin điền trên máy chủ sẽ được chuyển thành các thông điệp riêng cho mỗi trường để gửi đi và chờ đợi kết quả xác nhận từ máy chủ, máy chủ có thể kiểm tra lỗi cú pháp trước khi tiếp nhật một mục dữ liệu. Giải pháp tốt hơn sẽ là chuyển mã điền thông tin vào cửa sổ và kiểm tra các thông tin đó trên máy khách, để cho máy khách thực hiện kiểm tra tính hợp lệ của thông tin, điều này có thể thực hiện được bằng cách sử dụng Javascript cho các cửa sổ trên trình duyệt web.

Kỹ thuật thứ hai là phân tán, nghĩa là một thành phần sẽ được chia thành nhiều phần nhỏ hơn và trải đều trên toàn bộ hệ thống. Ví dụ điển hình là hệ thống tên miền của mạng Internet, không gian tên được tổ chức phân cấp thành các miền sau đó thành các khu vực, mỗi máy chủ chỉ cần lưu giữ tên miền trong khu vực phụ trách, phân giải tên miền thực chất là trả về địa chỉ logic của máy tính. Trang web là hệ thống thông tin dựa trên văn bản, mỗi văn bản được xác định bằng một tên duy nhất dưới dạng đường dẫn URL,  sử dụng URL giúp cho hệ thống có thể mở rộng qui mô. Để phân giải tên miền, máy khách phải gửi đường dẫn đến máy chủ tên miền, do cấu trúc phân cấp nên các yêu cầu sẽ không tập trung về một máy chủ nên vẫn luôn đảm bảo hiệu năng cho hệ thống. Việc mở rộng qui mô thường làm suy giảm hiệu năng của hệ thống, giải pháp tốt nhất là thực hiện nhân bản, nhân bản không chỉ làm tăng tính sẵn sàng mà còn cân bằng tải và như vậy hiệu năng có thể sẽ tốt hơn, đối với các hệ thống qui mô địa lý rộng lớn việc các bản sao đặt ngay gần người sử dụng sẽ giảm độ trễ truyền thông. Tuy nhiên thực hiện nhân bản lại dẫn đến vấn đề về nhất quán, có thể chấp nhận tính nhất quán tới mức nào tùy thuộc vào việc sử dụng tài nguyên, những giao dịch thương mại điện tử đòi hỏi tính nhất quán rất cao. Nhất quán mạnh đòi hỏi các cập nhật phải được lan truyền ngay lập tức đến tất cả các bản sao, nghĩa là đòi hỏi cơ chế đồng bộ trên toàn hệ thống, những kỹ thuật như vậy rất khó triển khai trong các hệ thống lớn. Dưới góc độ kỹ thuật, việc mở rộng qui mô người sử dụng được coi là đơn giản nhất, trong một số trường hợp thập chí chỉ cần tăng năng lực xử lý của máy chủ. Mở rộng qui mô về địa lý sẽ phức tạp hơn nhưng vẫn có thể kết hợp ba kỹ thuật trên để giải quyết các vấn đề về tính nhất quán. Mở rộng qui mô về miền quản trị vẫn là vấn đề phức tạp nhất vì phải giải quyết cả những vấn đề phi kỹ thuật, ví dụ chính sách của các đơn vị và sự cộng tác giữa các nhân viên quản trị. Tuy nhiên có những tiến bộ nhất định đã đạt được trong vấn đề nhày, chỉ cần đơn giản bỏ qua các vùng quản trị, ví dụ có thể sử dụng kỹ thuật điểm-điểm để người sử dụng đầu cuối tự kiểm soát, tuy nhiên đó chỉ là một phần trong việc giải quyết mở rộng qui mô quản trị.

1.5.5    Hệ thống phân tán và mạng máy tính

Phát triển các hệ thống phân tán là công việc rất lớn, cùng một lúc phải cân nhắc rất nhiều vấn đề và đó đều là những vấn đề phức tạp. Tuy nhiên vấn đề sẽ được giải quyết nếu làm theo các nguyên tắc thiết kế và tuân thủ nghiêm ngặt các mục tiêu đã đề ra. Việc phát triển hệ thống trước hết phải tuân theo những qui tắc của công nghệ phần mềm, nhưng phải luôn lưu ý điểm khác biệt cơ bản so với hệ thống tập trung,  các thành phần của hệ thống giao tiếp với nhau qua mạng. Khi phát triển hệ thống phân tán cần phải tránh những quan niệm chưa đúng sau:

-         Mạng đáng tin cậy.

-         Mạng đã được bảo mật.

-         Mạng là hệ thống đồng nhất.

-         Hình trạng mạng không bao giờ thay đổi.

-         Độ trễ lưu chuyển dữ liệu trên mạng bằng không.

-         Băng thông của mạng là vô hạn.

-         Chi phí vận chuyển bằng không.

-         Chỉ có một người quản trị.

Những vấn đề trên không cần thiết phải để ý khi phát triển các ứng dụng chạy độc lập trên một máy tính, nhưng đó lại là những vấn đề cần phải giải quyết khi phát triển hệ thống phân tán. Mạng không đáng tin cậy đòi hỏi  phải giải quyết vấn đề trong suốt về lỗi truyền thông, vấn đề bảo mật phải thực hiện bằng chính sách mã hóa và xác thực…,  như vậy có thể thấy một lượng công việc rất lớn và phức tạp  khi phát triển các hệ thống phân tán.

1.6        Kiến trúc hệ thống phân tán

Hệ thống phân tán là tổ hợp phức tạp các phần mềm vận hành trên nhiều máy tính, để làm chủ các thành phần phức tạp này cần phải tổ chức chúng một cách hợp lý, có thể nhìn nhận cách tổ chức này từ góc độ logic và vật lý. Tổ chức hệ thống phân tán chủ yếu là các phần mềm tham gia vào hệ thống, kiến trúc phần mềm cho biết các  phần mềm được tổ chức và tương tác với nhau như thế nào. Triển khai thực tế hệ thống phân tán đòi hỏi phải phác thảo và cài đặt các phần mềm trên máy tính thực, có nhiều lựa chọn để thực hiện công việc này, bản phác thảo cuối cùng về kiến trúc phần mềm còn gọi là kiến trúc hệ thống. Thông thường hệ thống phân tán sử dụng hai kiến trúc, kiến trúc tập trung và kiến trúc không tập trung. Trong kiến trúc tập trung, hầu hết các thành phần đều được đặt trên một máy chủ và các máy khách truy nhập qua mạng để sử dụng các dịch vụ, các máy trong kiến trúc không tập trung đóng vai trò tương đương nhau.

Mục tiêu thiết kế hệ thống phân tán là tách biệt phần ứng dụng với nền tảng bằng cách cung cấp thêm tầng trung gian, việc cài đặt thêm tầng trung gian đóng vai trò quan trọng trong kiến trúc của hệ thống phân tán và đó là mục tiêu chính để đảm bảo tính trong suốt phân tán. Tuy nhiên việc cân bằng giữa yêu cầu trong suốt sẽ dẫn đến những kỹ thuật khác nhau để tầng trung gian có khả năng thích nghi. Khả năng thích nghi trong hệ thống phân tán có thể đạt được bằng cách xây dựng hệ thống giám sát các hành vi và thực hiện các biện pháp thích hợp khi cần thiết, điều này dẫn tới khái niệm về các hệ thống tự trị và các hệ thống này thường được tổ chức dưới dạng các vòng lặp kiểm soát hồi qui, nó tạo nên phần tử kiến trúc trong việc thiết kế hệ thống.

1.6.1    Các mô hình kiến trúc

Cách tổ chức phần mềm của hệ thống gọi là mô hình kiến trúc của hệ thống phân tán, nó đóng vai trò rất quan trọng trong thiết kế các hệ thống lớn. Mô hình kiến trúc mô tả các thành phần kết nối với nhau, cơ chế trao đổi thông tin giữa chúng và cách cấu hình các thành phần với nhau để đảm bảo tính toàn vẹn của hệ thống. Thành phần là đơn vị mô đun với các giao diện rõ ràng và có khả năng thay thế bên trong môi trường mà không ảnh hưởng đến giao diện của nó. Liên kết là cơ chế trung gian truyền thông để các thành phần có thể phối hợp với nhau, ví dụ như các phương tiện để gọi thủ tục từ xa hoặc truyền thông điệp. Sử dụng thành phần và các liên kết giữa chúng sẽ cho cho những hình trạng khác nhau, từ đó hình thành nên các dạng mô hình kiến trúc, hệ thống phân tán gồm bốn mô hình sau:

-         Mô hình phân tầng

-         Mô hình dựa trên đối tượng

-         Mô hình dựa trên sự kiện

-         Mô hình dữ liệu tập trung

Mô hình  kiến trúc đóng vai trò quan trọng trong các hệ thống phân tán vì chúng hướng tới tính trong suốt về phân bố. Tuy nhiên trong suốt về phân bố đòi hỏi phải cân bằng giữa hiệu năng, khả năng chịu lỗi và thời gian phát triển hệ thống. Không một kiến trúc nào có thể đáp ứng yêu cầu cho tất cả các loại ứng dụng phân tán, do đó cần phải phân tích và lựa chọn mô hình thích hợp với yêu cầu của người sử dụng.

1.6.1.1     Mô hình phân tầng

Các thành phần trong mô hình phân tầng được tổ chức thành từng tầng có sự ràng buộc chặt chẽ với nhau, tầng trên gọi các thành phần tầng dưới liền kề, đây là mô hình đã được áp dụng để xây dựng hệ thống mạng. Yêu cầu của bên gửi sẽ được  chuyển từ tầng trên xuống tầng dưới, kết quả trả về được chuyển từ tầng dưới lên tầng trên. Nhận được yêu cầu, bên thực hiện sẽ chuyển từ tầng dưới lên tầng trên, kết quả trả về sẽ lại được chuyển từ tầng trên xuống tầng dưới, từ đó sẽ được chuyển qua mạng đến tầng thấp nhất của bên gửi và lần lượt chuyển qua các tầng cao hơn.

 

Hình 1.5 Mô hình phân tầng

 

Như vậy, số lượng tầng càng lớn thì hệ thống sẽ càng được mô đun hóa cao, tuy nhiên hiệu năng hệ thống có thể bị suy giảm. Mô hình này đảm bảo tính chính xác rất cao, chỉ cần xảy ra lỗi tại một tầng thì coi như yêu cầu của bên gửi sẽ không được thực hiện. Ưu điểm nổi bật của mô hình này là khả năng nâng cấp, bảo trì cũng như mở rộng tính năng của mỗi tầng sẽ không ảnh hưởng đến các tầng khác.

1.6.1.2     Mô hình đối tượng phân tán

Cùng với mô hình phân tầng, mô hình đối tượng phân tán đóng vai trò quan trọng trong các hệ thống phân tán lớn. Mô hình đối tượng phân tán ràng buộc lỏng hơn mô hình phân tầng, mỗi đối tượng được coi là một thành phần và được kết nối thông qua cơ chế gọi thủ tục từ xa. Các đối tượng trong mô hình này hoạt động tương đối độc lập, dễ dàng thay đổi và nâng cấp, đây là mô hình được đã được lựa chọn để triển khai cho dịch vụ khách/chủ. Vì các đối tượng gọi trực tiếp nên thời gian trễ thấp và do đó rất phù hợp với những ứng dụng yêu cầu thời gian thực. Tuy nhiên, nhược điểm của nó nằm ở việc đối tượng gọi không biết đối tượng bị gọi có sẵn sàng đáp ứng yêu cầu dịch vụ hay không, nếu quá nhiều đối tượng gửi yêu cầu đến một đối tượng thì gây ra hiện tượng quá tải. Một nhược điểm khác nữa cần kể đến là hiện tượng phong tỏa bên gọi, thời gian chờ đợi sẽ phụ thuộc vào thời gian vận chuyển dữ liệu cộng với thời gian xử lý yêu cầu, điều này có thể dẫn tới hiện tượng lỗi quá thời gian.

Hình 1.6 Mô hình đối tượng phân tán

 

Mỗi đối tượng phân tán là một thể hiện của lớp, điều này giống như lập trình hướng đối tượng, mỗi lớp có các thuộc tính và phương thức xử lý, như vậy nó sẽ dễ hiểu và dễ dàng nâng cấp khi cần thiết. Ví dụ điển hình cho mô hình này là DCOM của Microsoft, nó cho phép các ứng dụng dễ dàng trao đổi thông tin với nhau trên môi trường mạng. Trong thực tế, rất nhiều hệ thống phân tán đã được xây dựng theo cách kết hợp mô hình phân tầng và mô hình đối tượng phân tán.

1.6.1.3     Mô hình kênh sự kiện

Trong mô hình kênh sự kiện, về cơ bản các tiến trình trao liên lạc với nhau thông qua sự lan tỏa các sự kiện, các sự kiện có thể mang theo dữ liệu và thường được gắn với các luật phân phát sự kiện. Các tiến trình phát tán sự kiện sau khi đã được phần mềm trung gian đảm bảo chỉ những tiến trình đã đăng ký mới nhận được sự kiện. Mức độ ràng buộc giữa các tiến trình của mô hình này tương đối thấp, về nguyên tắc thì các thành phần không cần phải tham chiếu đến nhau, như vậy quan hệ giữa các thành phần có thể coi như những cặp lỏng.

 

Hình 1.7 Mô hình kênh sự kiện

Kênh sự kiện thực chất là một tiến trình làm trung gian cho các tiến trình khác trong hệ thống, nó có một tác tử luôn theo dõi vận hành của các thành viên trong hệ thống. Mỗi thành phần cung cấp dịch vụ sẽ đăng ký với kênh sự kiện, khi một tiến trình thành viên có yêu cầu dịch vụ, nó gửi đến kênh sự kiện, kênh sự kiện sẽ tiếp nhận và tìm kiếm tiến trình có thể đáp ứng yêu cầu và kết nối các thành viên đó để trao đổi với nhau. Như vậy đây là mô hình rất phù hợp cho các hệ thống có khả năng phân tải và dự phòng nóng.

1.6.1.4     Mô hình dữ liệu tập trung

Ba mô hình đã đề cập trên đòi hỏi các tiến trình cung cấp dịch vụ luôn phải ở trạng thái hoạt động, hơn nữa nếu lượng dữ liệu lớn có thể dẫn tới hiện tượng quá thời gian. Mô hình dữ liệu tập trung phát triển dựa trên ý tưởng các tiến trình trao đổi thông tin với nhau qua kho dữ liệu chung theo phương thức chủ động hoặc thụ động. Mô hình này đảm bảo tính độc lập giữa các thành phần trong hệ thống và đồng thời tiện lợi cho việc chia sẻ dữ liệu lớn.

 

Hình 1.8 Mô hình dữ liệu tập trung

 

Mô hình kênh sự kiện có thể kết hợp với mô hình dữ liệu tập trung để hình thành nên các không gian dữ liệu chia sẻ, các tiến trình ràng buộc lỏng, chúng không cần phải đồng thời ở trạng thái hoạt động. Hơn nữa nhiều không gian dữ liệu chia sẻ sử dụng giao diện tương tự như SQL để truy nhập kho dữ liệu và như vậy có thể truy nhập bằng cách sử dụng mô tả chứ không cần phải tham chiếu, ví dụ điển hình là hệ thống chia sẻ tập tin.

1.6.2    Kiến trúc hệ thống

Hệ thống phân tán có thể được xây dựng theo kiến trúc tập trung, không tập trung hoặc lai ghép hai loại trên. Kiến trúc tập trung còn gọi là kiến trúc dọc, các công việc xử lý được thực hiện bằng cách đặt các máy tính lớn theo cấu trúc phân tầng, các tiến trình xử lý được phân cho các tầng thấp hơn tương ứng với cấu trúc tổ chức và loại nhiệm vụ. Kiến trúc không tập trung còn gọi là kiến trúc ngang, nhiều máy tính được kết nối ngang hàng vào mạng để xử lý công việc, có thể thêm máy tính  nhằm nâng cao độ linh hoạt và nâng cấp hệ thống. Các công việc trước kia được tập trung trên một máy tính thì có thể chia sẻ với các máy tính khác. Có thể sử dụng các thư viện được cung cấp từ các máy tính khác, điều này đảm bảo được sự phân tán chức năng và sử dụng chung các nguồn tài nguyên.

1.6.2.1     Kiến trúc tập trung

Mặc dù còn có nhiều điểm khác biệt trong cách nhìn nhận những vấn đề của hệ thống phân tán, các nhà nghiên cứu cũng như những người làm thực tế đều nhất trí lấy trường hợp máy khách yêu cầu dịch vụ từ máy chủ đề hiểu và quản lý sự phức tạp của hệ thống phân tán. Trong mô hình khách/chủ cơ bản, các tiến trình trong hệ thống phân tán chia làm hai nhóm, tiến trình máy chủ cài đặt một dịch vụ cụ thể và tiến trình máy khách yêu cầu dịch vụ từ máy chủ bằng cách gửi yêu cầu sau đó chờ đợi kết quả trả về. Mô hình khách/chủ  đang được áp dụng phổ biến trong các hệ thống phân tán, hiện nay mô hình này đã phát triển theo hướng sử dụng các đối tượng phân tán. Mô hình khách/chủ được hiểu là hình thức trao đổi thông tin giữa các tiên trình cung cấp dịch vụ và tiến trình sử dụng dịch vụ, máy khách yêu cầu các dịch vụ đã được cài đặt trên máy chủ, máy chủ xử lý yêu cầu và trả về kết quả cho máy khách.

Hình 1.9 Tương tác khách/chủ

 

Cơ chế truyền tin sử dụng truyền thông liên tiến trình, có thể sử dụng cả hai loại giao thức truyền thông có liên kết và không liên kết, thông thường giao thức không liên kết được sử dụng trong các mạng có độ tin cậy cao, sử dụng giao thức không liên kết có ưu điểm về hiệu năng. Nếu các thông điệp không bị thất lạc hoặc lỗi thì giao thức hỏi/đáp sẽ làm việc rất tốt, rất tiếc việc thực hiện giao thức này thỉnh thoảng gặp phải lỗi truyền thông, nếu không thấy phản hồi thông thường máy khách sẽ phải gửi lại. Vấn đề nằm ở chỗ máy khách không thể phát hiện thông điệp bị thất lạc hay thông điệp gặp lỗi truyền thông, nếu thông điệp kết quả trả về bị thất lạc thì mà máy khách gửi lại yêu cầu thì sẽ xảy ra hiện tượng lặp. Việc lặp yêu cầu có thể làm tổn hại thông tin trong hệ thống, máy khách hoặc máy chủ không thể tự giải quyết những trường hợp này, cần thiết phải xây dựng cơ chế phối hợp giữa các bên tham gia. Giao thức có liên kết thường được sử dụng trong mạng diện rộng, hiệu năng có thể bị suy giảm vì phải thiết lập và hủy bỏ liên kết trước và sau khi truyền thông điệp, tuy nhiên nó khắc phục nhược điểm không tin cậy trong mạng diện rộng. Mô hình khách/chủ  đóng vai trò quan trọng trong các hệ thống phân tán, nó có các đặc trưng sau:

-         Máy khách và máy chủ là các mô đun chức năng với các giao diện xác định: Các chức năng thực hiện của máy khách hoặc máy chủ có thể gồm nhiều chức năng con, việc cài đặt các ứng dụng máy khách hoặc máy chủ không nhất thiết phải trên máy chủ mà có thể cài đặt tại bất cứ máy nào trên mạng.

-         Quan hệ khách/chủ được thiết lập giữa hai mô đun khi máy khách đưa ra yêu cầu dịch vụ và được máy chủ đáp lại: Khái niệm máy khách và máy chủ chỉ là tương đối, một mô đun có thể đóng vai trò máy chủ đối với mô đun này nhưng lại đóng vai trò máy khách đối với mô đun khác.

-         Trao đổi thông tin giữa các mô đun được thực hiện thông qua có chế truyền thông điệp: tất cả các yêu cầu của máy khách được tập hợp thành thông điệp để chuyển đến máy chủ và ngược lại các kết quả trả về cũng được đặt trong các tin báo để chuyển đến máy khách.

-         Trao đổi thông điệp giữa máy khách và máy chủ thường được thực hiện theo cơ chế hỏi/đáp.

-         Máy khách và máy chủ được cài đặt trên các máy tính khác nhau và được nối với nhau trên mạng: Về mặt lý thuyết, trên cùng một máy có thể cài đặt đồng thời mô đun khách và mô đun chủ, tuy nhiên trong thực tế thường các mô-đun này được cài đặt trên các máy khác nhau.

 

Tiến trình Máy khách

 

Giao thức trao đổi lớp trên

Tiến trình Máy chủ

Phần mềm trung gian Máy khách (MiddleWare)

Phần mềm trung gian Máy chủ (MiddleWare)

Dịch vụ cục bộ

Dịch vụ mạng

Dịch vụ mạng

Dịch vụ cục bộ

Hệ điều hành và thiết bị phần cứng

Hệ điều hành và thiết bị phần cứng

 

Trao đổi thông tin tầng vật lý

 

 

Hình 1.10 Các thành phần cơ bản trong mô hình khách/chủ

Với các đặc điểm trên, mô hình khách/chủ có thể cài đặt theo hai mức, mức dịch vụ nền và mức ứng dụng. Mức dịch vụ nền tạo cơ sở để phát triển, hỗ trợ và quản lý các ứng dụng khách/chủ trong khi đó mức ứng dụng cung cấp các chức năng nghiệp vụ.   hình khách/chủ cung cấp các phương tiện tích hợp các ứng dụng riêng với các nhu cầu xử lý nghiệp vụ chung để đảm bảo thống nhất việc xử lý thông tin trong toàn bộ hệ thống, mô hình này có các ưu điểm sau:

-         Chia sẻ dữ liệu: Dữ liệu được lưu trên máy chủ để sẵn sàng cung cấp cho tất cả những người sử dụng được quyền truy nhập. Việc sử dụng ngôn ngữ SQL để thống nhất các thao tác truy xuất đã hỗ trợ cho người sử dụng dễ dàng truy nhập dữ liệu.

-         Các dịch vụ tích hợp: Người sử dụng hợp pháp đều có thể nhận được thông tin cần thiết từ các máy khách và có thể xử lý các thông tin này theo nhu cầu sử dụng. Theo quyền truy nhập, máy khách sử dụng chung các dịch vụ do máy chủ cung cấp.

-         Chia sẻ tài nguyên giữa các hệ thống khác nhau: Có thể tạo các ứng dụng độc lập với hệ điều hành và thiết bị phần cứng, do đó các ứng dụng máy khách đều có thể sử dụng các tài nguyên chung trên mạng như dữ liệu, dịch vụ....

-         Khả năng trao đổi và tương thích dữ liệu: Hầu hết  các công cụ sử dụng để phát triển các sản phẩm theo mô hình khách/chủ đều dựa trên tiêu chuẩn của ngôn ngữ SQL, do đó đảm bảo được tính tương thích và khả năng trao đổi dữ liệu giữa các tiến trình máy khách và máy chủ.

-         Không phụ thuộc thiết bị lưu trữ dữ liệu: Trên máy chủ, dữ liệu có thể được lưu trữ trong các thiết bị khác nhau như đĩa từ hoặc băng từ, người sử dụng vẫn dùng tập các lệnh chung để truy xuất dữ liệu mà không phụ thuộc vào phương tiện lưu trữ.

-         Độc lập với vị trí xử lý dữ liệu:  Việc truy xuất dữ liệu không phụ thuộc vào thiết bị phần cứng, hệ điều hành và vị trí lưu trữ dữ liệu.

-         Quản lý tập trung: Việc quản lý tập trung được thực hiện bằng cách sử dụng các công cụ giám sát và hỗ trợ từ trung tâm.

Các thành phần cơ bản trong mô hình khách/chủ bao gồm tiến trình máy khách, máy chủ, phần mềm trung gian, dịch vụ mạng,  dịch vụ cục bộ/dịch vụ mạng để quản lý dữ liệu và quản lý tiến trình, hệ điều hành và thiết bị phần cứng. Tiến trình máy khách bao gồm các chức năng của lớp ứng dụng, nó thực hiện giao tiếp với người sử dụng và các chức năng ứng dụng cần thiết như hiển thị thông tin, tính toán các bảng tính... Tiến trình máy khách giao tiếp với các phần mềm trung gian qua giao diện lập trình ứng dụng để gửi các yêu cầu đến máy chủ và nhận kết quả trả về. Tiến trình máy chủ thực hiện các chức năng tầng ứng dụng, nó cung cấp các dịch vụ cho máy khách với việc che giấu các thông tin riêng, đảm bảo cung cấp các dịch vụ xử lý lỗi và có thể thực hiện chức năng giám sát/điều phối.

Phần mềm trung gian cung cấp nhiều tính năng khác nhau như thiết lập phiên làm việc giữa các tiến trình, bảo mật dữ liệu, nén/giải nén dữ liệu, xử lý lỗi. Tầng trung gian đóng vai trò kết nối tiến trình máy khách với tiến trình máy chủ, nó giao tiếp với các tiến trình qua giao diện lập trình ứng dụng. Phần mềm trung gian trên máy khách thực hiện các chức năng cung cấp giao diện lập trình ứng dụng, thiết lập liên kết với tiến trình trên máy chủ bằng cách gửi các lệnh thông qua giao diện mạng và phần mềm trung gian của máy chủ. Phần mềm trung gian trên máy chủ giám sát các yêu cầu từ phía máy khách và gọi các tiến trình máy chủ tương ứng, nó tiếp nhận các yêu cầu từ phía máy khách và chuyển các yêu cầu đó cho tiến trình máy chủ, kiểm tra bảo mật hệ thống, xử lý tương tranh khi đồng thời nhận được nhiều yêu cầu từ phía máy khách, nhận kết quả xử lý của tiến trình máy chủ để trả về tiến trình trên máy khách, giám sát và xử lý lỗi.

Mô hình khách/chủ là chủ đề của nhiều cuộc tranh luận về việc làm rõ khái niệm khách/chủ, một tiến trình là chủ đối đối với máy khách này nhưng lại có thể là khách đối với tiến trình chủ khác, ví dụ khi tiếp nhận một yêu cầu từ máy khách tiến trình máy chủ có thể lại gọi dịch vụ từ máy chủ khác. Tuy nhiên khi xem xét nhiều ứng dụng truy nhập dữ liệu, hầu hết mọi người đều nhất trí phân biệt ba mức và gọi là kiến trúc phân tầng, đó là mức giao tiếp với người sử dụng, mức xử lý và mức dữ liệu. Mức giao diện người sử dụng chứa những thao tác cần thiết để giao tiếp trực tiếp với người sử dụng, ví dụ như hiển thị các tính năng quản lý. Mức xử lý thường chứa các ứng dụng nghiệp vụ trong khi đó mức dữ liệu mới thực sự quản lý và thao tác trực tiếp với dữ liệu. Thông thường máy khách cài đặt mức giao diện người sử dụng, đó là các chương trình cho phép người sử dụng tương tác với các ứng dụng, có những điểm khác biệt đáng kể trong các chương trình giao diện người dùng phức tạp. Giao diện đơn giản nhất là màn hình hiển thị tương tác dạng ký tự, đó là giao diện phổ biến trong các môi trường giao tiếp với tiến trình máy chủ, ví dụ như các giao diện của các ứng dụng quản lý thiết bị/máy chủ. Trước đây đầu cuối của người sử dụng có thể chỉ gồm các chức năng hiển thị mà không có chức năng xử lý, hiện nay giao diện của người sử dụng đã được cải thiện đáng kể, người dùng đã có thể sử dụng giao diện đồ họa để tương tác với máy chủ. Trong giai đoạn đầu phát triển hệ thống phân tán nên cung cấp các giao diện thể hiện bốn thao tác cơ bản của người sử dụng đối với dữ liệu, những giao diện này có thể chưa thực sự thân thiện nhưng nó đảm bảo tính chính xác cho các nghiệp vụ xử lý, thời gian đưa các sản phẩm vào khai thác cũng sẽ được rút ngắn. Nhiều ứng dụng khách/chủ được xây dựng dựa trên ba thành phần, thành phần tương tác với người sử dụng, thành phân truy nhập dữ liệu và ở giữa hai thành phần trên là thành phần xử lý nghiệp vụ.

 

Hình 1.11 Tổ chức phân tầng máy tìm kiếm trên Internet

 

Khác với thành phần giao diện người sử dụng và thành phần truy nhập dữ liệu, thành phần xử lý nghiệp vụ thường không có những khía cạnh chung, mỗi dịch vụ cụ thể sẽ có những yêu cầu xử lý riêng. Ví dụ về ứng dụng tìm kiếm trên mạng Internet, bỏ qua các ảnh và những thứ tô điểm cho trang tìm kiếm thì giao diện sẽ chỉ còn là phần nhập nội dung và sau đó là phần hiển thị kết quả tìm kiếm. Phía sau của trang tìm kiếm đó là cả một cơ sở rất lớn chứa đường dẫn đến các trang web và chúng đều được đánh chỉ mục, lõi của máy tìm kiếm là một chương trình chuyển đổi xâu ký tự tìm kiếm thành một hoặc nhiều truy vấn cơ sở dữ liệu sau đó sắp xếp theo thứ bậc và chuyển thành định dạng HTML để hiển thị trên các trình duyệt, như vậy những công việc này sẽ được đặt vào tầng xử lý nghiệp vụ.

Mức dữ liệu trong mô hình khách/chủ chứa các chương trình duy trì dữ liệu thực để các ứng dụng có thể vận hành, dữ liệu ở đây thường là bền vững, kể cả không một ứng dụng nào chạy thì dữ liệu vẫn được lưu để phục vụ cho lần sử dụng kế tiếp. Dạng đơn giản nhất là hệ thống tập tin, nhưng thông thường thì được tổ chức thành cơ sở dữ liệu, tromg mô hình khách/chủ mức này thường cài đặt tại phía máy chủ. Bên cạnh nhiệm vụ chính lưu trữ dữ liệu, mức dữ liệu có trách nhiệm duy trì tính nhất quán  cho các ứng dụng khác nhau. Khi đang sử dụng cơ sở dữ liệu, việc duy trì tính nhất quán nghĩa là phải đảm bảo các mô tả và ràng buộc dữ liệu, ví dụ có thể phát ra những cảnh báo khi thấy dữ liệu vượt ngưỡng đã qui định trước. Hầu hết các hệ thống hiện nay đều sử dụng cơ sở dữ liệu quan hệ, sự độc lập dữ liệu rất quan trọng, dữ liệu được tổ chức độc lập với ứng dụng và như vậy việc thay đổi tổ chức dữ liệu sẽ không ảnh hưởng đến các ứng dùng và ngược lại việc thay đổi các ứng dụng cũng không ảnh hưởng đến việc tổ chức dữ liệu. Sử dụng các cơ sở dữ liệu quan hệ trong mô hình khách/chủ giúp tách biệt nức xử lý với mức dữ liệu, do đó có thể coi công việc xử lý và dữ liệu độc lập với nhau. Cơ sở dữ liệu quan hệ không phải là lựa chọn lý tưởng, nhiều ứng dụng hoạt động trên những loại dữ liệu phức tạp và được mô hình hóa thành các đối tượng thay cho các quan hệ, ví dụ thể hiện các đa giác và các hình tròn trong các hệ thống thiết kế trợ giúp máy tính. Trong những trường hợp này, các thao tác dữ liệu thường thể hiện bằng khái niệm thao tác với đối tượng, những cơ sở dữ liệu như vậy gọi là cơ sở dữ liệu hướng đối tượng hay cơ sở dữ liệu quan hệ đối tượng.

Hình 1.12 Tổ chức phân chia xử lý trong kiến trúc hai bên

 

Phân biệt ba mức logic như trên, giả thiết số khả năng phân tán vật lý ứng dụng khách chủ trên nhiều máy, cách tổ chức đơn giản nhất là máy khách chứa các chương trình cài đặt giao diện người sử dụng và máy chủ thực hiện mức nghiệp vụ và mức truy nhập dữ liệu. Với cách tổ chức như vậy thì máy chủ thực hiện mọi công việc và về bản chất thì máy khách vẫn chỉ là đầu cuối câm, có chăng chỉ là vài công việc giao diện đồ họa. Có nhiều khả năng lựa chọn cài đặt khác để phân phối nhiệm vụ giữa tiến trình trên máy khách, một trong các cách tiếp cận là phân tán các chương trình trong tầng ứng dụng trên các máy khác nhau.

Hình 1.13 Máy chủ đóng vai trò máy khách

 

Trước hết cần phân biệt hai loại máy khách và máy chủ, gọi là kiến trúc hai bên, máy khách chỉ thực hiện xử lý mức giao diện như một đầu cuối câm nhưng đồng thời cũng có thể thực hiện một số thao tác của mức nghiệp vụ và mức dữ liệu. Tất nhiên các chức năng của mức nghiệp vụ và mức dữ liệu chuyển về cho máy khách không phải là giải pháp tốt, đơn giản vì như vậy việc quản lý sẽ khó khăn hơn rất nhiều. Ngoài ra, việc chuyển các chức năng của các mức này về máy khách sẽ làm cho hệ thống phụ thuộc nhiều hơn vào máy khách, thông thường chỉ nên xây dựng ứng dụng cho máy khách ở mức độ 1 đến 3. Xử lý phía máy chủ có xu thể chuyển sang nhiều máy tính, máy chủ cũng có thể đóng vai trò như máy khách, giải pháp này gọi là kiến trúc ba bên. Trong kiến trúc này, các chương trình hình thành mức xử lý nghiệp vụ chạy trên các máy chủ riêng biệt nhưng về cơ bản vẫn là mô hình khách/chủ. Ví dụ, máy chủ web hoạt động như một điểm tiếp nhận, nó chuyển yêu cầu cho máy chủ ứng dụng và ở đó mới thực sự xử lý các yêu cầu, máy chủ ứng dụng lại tương tác với máy chủ cơ sở dữ liệu.

1.6.2.2     Kiến trúc không tập trung

Kiến trúc khách chủ nhiều bên là kết quả trực tiếp của việc chia ứng dụng thành các mức giao diện, xử lý và dữ liệu, các bên khác nhau tương ứng với tổ chức logic của ứng dụng. Trong nhiều môi trường nghiệp vụ, xử lý phân tán tương đương với tổ chức ứng dụng khách chủ giống như kiến trúc nhiều bên và gọi là phân tán không tập trung. Kiến trúc phân tán dọc đặt các thành phần logic khác nhau trên các máy khác nhau, khái niệm này liên quan với quan điểm phân mảnh dọc trong các cơ sở dữ liệu quan hệ phân tán, một bảng chia thành nhiều cột và phân tán trên nhiều máy khác nhau. Từ góc độ quản trị hệ thống, phân tán dọc giúp cho các chức năng được tách vật lý và logic trên nhiều máy và mỗi máy sẽ chuyên sâu vào một nhóm chức năng cụ thể. Tuy nhiên phân tán dọc mới chỉ là một trong các phương pháp tổ chức các ứng dụng khách/chủ, trong kiến trúc hiện đại còn áp dụng phân tán ngang hay còn gọi là hệ thống ngang hàng, máy khách và máy chủ có thể chia thành các phần tương đương nhau nhưng mỗi phần hoạt động trên một tập dữ liệu hoàn chỉnh, như vậy có thể thực hiện được các chức năng dự phòng hoặc cân bằng tải.

Hình 1.14 Ánh xạ mục dữ liệu vào các nút trong Chord

Xét quan điểm mức cao, các tiến trình hình thành hệ thống ngang hàng đều như nhau, nghĩa là các chức năng cần thiết đều hiện diện trên mỗi tiến trình, do đó nhiều tương tác tiến trình là đối xứng, mỗi tiến trình tại một thời điểm có thể đóng cả hai vai trò khách và chủ. Với phong cách đối xứng như vậy, kiến trúc ngang hàng nảy sinh vấn đề làm thế nào có thể tổ chức các tiến trình thành mạng bao trùm, nghĩa là mang được hình thành từ các nút mà ở đó các tiến trình liên kết với nhau để thể hiện các kênh truyền thông. Nói chung, tiến trình không thể trao đổi trực tiếp với một tiến trình bất kỳ khác, nó phải gửi thông điệp thông qua kênh truyền thông sẵn có. Mạng bao trùm gồm hai loại, có cấu trúc và phi cấu trúc, mạng bao trùm có cấu trúc sử dụng thủ tục tiền định, các tiến trình được tổ chức thông qua bảng băm phân tán. Trong hệ thống dựa trên bảng băm phân tán, các mục dữ liệu và các nút được gán khóa nhẫu nhiên từ không gian định danh dài 128 hoặc 160 bit.

Điểm mấu chốt của hệ thống dựa trên bảng băm phân tán là cài đặt lược đồ hiệu quả để ánh xạ duy nhất khóa của mục dữ liệu với định danh của nút dựa trên chỉ số khoảng cách. Khi tìm kiếm một mục dữ liệu thì sẽ trả về địa chỉ mạng của nút có trách nhiệm đối với mục dữ liệu đó, điều này được thực hiện bằng cách định tuyến yêu cầu mục dữ liệu đến nút có trách nhiệm. Ví dụ trong hệ thống Chord, các nút được tổ chức logic thành vòng sao cho mục dữ liệu khóa k ánh xạ đến nút với định danh lớn hơn hoặc bằng k, nút đó gọi là nút kế tiếp và ký hiệu là succ(k). Để tìm kiếm mục dữ liệu ứng dụng chạy trên nút tùy ý sẽ gọi hàm lookup(k) để hàm này trả về địa chỉ của nút succ(k), như vậy ứng dụng có thể liên lạc với nút để sao chép mục dữ liệu. Làm sao có thể tổ chức các nút thành mạng bao trùm, việc tìm kiếm  khóa không theo cách tổ chức logic của các nút mà mỗi nút sẽ duy trì một thông tin chỉ đường đến các nút khác, như vậy nếu mạng gồm N nút thì có thể hoàn thành tìm kiếm sau O(log(N)) bước.  Khi một nút muốn tham gia vào hệ thống, nó khởi tạo một định danh ngẫu nhiên chưa có thành viên nào sử dụng và gọi hàm succ(id) để tìm địa chỉ của nút kế tiếp và liên hệ với nút đó. Mỗi nút phải lưu trữ thông tin về nút liền trước và nút kế tiếp, việc chèn thêm một nút cho biết mỗi mục dữ liệu có khóa liên quan tới nút id sẽ được chuyển từ succ(id).

Hình 1.15 Mạng địa chỉ nội dung

 

Mạng địa chỉ nội dung (CAN) sử dụng không gian tọa độ đa chiều, chúng phân mảnh theo các nút tham gia hệ thống. Hình 1.15 minh họa không gian hai chiều chia thành sáu nút, mỗi nút có một khu vực liên quan, mỗi mục dữ liệu trong CAN được gán điểm duy nhất trong không gian này, mỗi nút có trách nhiệm cho một số mục dữ liệu ngoại trừ những mục thuộc vùng giáp gianh. Khi nút P muốn tham gia vào hệ thống CAN, nó nhặt điểm bất kỳ từ không gian tọa độ và sau đó tìm kiếm nút Q trong khu vực điểm rơi, việc tìm kiếm này được thực hiện thông qua định tuyến dựa trên vị trí, sau đó sẽ tách vùng Q thành hai phần để một phần gán cho P. Các nút lưu vết những hàng xóm của mình, nghĩa là các nút có trách nhiệm cho khu vực kề cạnh, khi tách vùng thì nút P có thể dễ dàng biết được những hàng xóm bằng cách hỏi nút Q. Giống như trong Chord, các mục dữ liệu cho mỗi nút P giờ đây sẽ được chuyển từ nút Q. Việc loại bỏ một nút sẽ phức tạp hơn, việc quản lý vùng có nút bị loại bỏ sẽ chuyển cho một trong những nút hàng xóm, nút hàng xóm tiếp nhận sẽ thông báo cho các hàng xóm cũ về việc chuyển giao, như vậy có thể việc phân mảnh không còn giữ được tính đối xứng và do đó một tiến trình nền phải định kỳ thực hiện phân vùng lại cho toàn bộ không gian.

Các hệ thống ngang hàng phi cấu trúc phần lớn dựa trên các giải thuật nhẫu nhiên để xây dựng mạng bao trùm, mỗi nút duy trì danh sách hàng xóm theo cách ngẫu nhiên và các mục dữ liệu cũng được đặt ngẫu nhiên trên mỗi nút, như vậy để xác định một mục dữ liệu cụ thể thì cần phải gửi nhiều thông điệp truy vấn tìm kiếm. Một trong những mục tiêu của nhiều hệ thống ngang hàng phi cấu trúc là xây dựng mạng phủ tương tự như đồ thị ngẫu nhiên, mỗi nút duy trì danh sách các hàng xóm đại diện cho các nút đang hoạt động. Có nhiều cách để xây dựng danh sách này, ví dụ các nút có thể thường xuyên trao đổi mục dữ liệu về hàng xóm mới, trong đó chứa thông tin về thời gian quá hạn cho mỗi mục dữ liệu. Để thực hiện công việc này chỉ cần xây dựng hai luồng, luồng chủ động và luồng bị động. Luồng chủ động là luồng khởi tạo truyền thông với nút khác lấy từ danh sách ngẫu nhiên, luồng bị động là luồng tiếp nhận dữ liệu lấy từ vùng đệm nhận. Việc rời khỏi mạng cũng được thực hiện đơn giản mà không cần phải thông báo cho nút khác biết, nếu một nút không liên lạc được với nút khác trong danh sách thì có thể loại bỏ nút đó.  

1.6.2.3     Kiến trúc lai ghép

Nhiều hệ thống phân tán kết hợp hai loại kiến trúc trên để hình thành hệ thống với kiến trúc lai ghép, các giải pháp khách chủ được kết hợp với kiến trúc không tập trung, hệ thống các máy chủ biên hoặc hệ thống phân tán cộng tác thuộc loại này. Sự hiện diện của hệ thống các máy chủ biên là cần thiết đối cho việc kết nối liên mạng, khi sử dụng  Internet, mỗi máy khách phải kết nối với máy chủ của nhà cung cấp dịch vụ  Internet (ISP), như vậy máy chủ của các ISP đóng vai trò là những máy chủ biên, chúng có thể phối hợp với nhau để tối ưu hóa việc cung cấp nội dung cho máy khách.

Các ví dụ về hệ thống phân tán cộng tác có thể kể đến như hệ thống chia sẻ tập tin ngang hàng (BitTorrent) và hệ thống phân phát nội dung cộng tác (Globule). BitTorrent cho phép người dùng có thể phân phối dữ liệu theo kiến trúc không tập trung, với phương châm có đi có lại, nó có thể điều phối bằng tốc độ truyền dữ liệu. Với những hệ thống xây dựng tương tự Globule, yêu cầu của người dùng được chuyển đến máy chủ, như vậy đó là kiến trúc tập trung, nhưng nội dung thông tin sẽ được máy chủ tìm kiếm trên các hệ thống khác, như vậy đó là kiến phúc không tập trung.

1.6.3    Kiến trúc hệ thống và phần mềm trung gian

Phần mềm trung gian hình thành tầng mới nằm giữa các ứng dụng và nền tảng của hệ thống phân tán, nó cung cấp tính năng trong suốt về phân phối dữ liệu, xử lý và điều khiển từ các ứng dụng. Sử dụng phần mềm trung gian làm cho việc thiết kế các hệ thống phân tán trở nên đơn giản hơn, tuy nhiên nó có thể không phải là giải pháp tối ưu nhất đối với các phần mềm ứng dụng, có thể khắc phục nhược điểm này bằng cách cung cấp các phiên bản phần mềm trung gian và phần mềm ứng dụng có thể dễ dàng cấu hình để tùy biến theo yêu cầu thực tiễn.

1.6.4    Tự quản lý trong các hệ thống phân tán

Các hệ thống phân tán và phần mềm trung gian cần phải cung cấp giải pháp tổng thể đương đầu với những vấn đề ngoài mong muốn thường xảy ra trên mạng để chúng có thể hỗ trợ nhiều ứng dụng nhất có thể. Nhiều ứng dụng cũng không thực sự mong muốn tính trong suốt hoàn toàn về phân phối, điều đó đòi hỏi hệ thống phân tán phải hỗ trợ các giải pháp riêng cho từng ứng dụng, do đó hệ thống phân tán phải có khả năng thích ứng, điều chỉnh hành vi thực hiện của chúng chứ không phải các phần mềm cấu thành hệ thống phân tán. Nếu sự thích ứng này cần được thực hiện tự động thì sẽ có sự tác động lẫn nhau giữa kiến trúc hệ thống và kiến trúc phần mềm. Một mặt, cần tổ chức các thành phần của hệ thống phân tán sao cho có thể thực hiện việc giám sát và điều chỉnh, mặt khác cần quyết định nơi thực hiện các tiến trình để xử lý việc điều chỉnh. Ví dụ các hệ thống điều khiển phản hồi cho phép tự động thích ứng với các thay đổi, chúng tự quản lý, tự cấu hình và tối ưu hóa, thậm chí có thể tự phục hồi.

 

THẢO LUẬN:

1.      Giải quyết vấn đề độ trễ mạng làm ảnh hưởng đáng kể đến hiệu năng của hệ thống phân tán.

2.      Tìm hiểu kiến trúc khách chủ ba bên.

3.      So sánh hai loại phân bố ngang và phân bố dọc

4.      Nêu các vấn đề chính khi thực hiện yêu cầu hỏi/đáp nếu sử dụng chuỗi các tiến trình P0, P1,… Pi-1, Pi, Pi+1, .. Pn, trong đó Pi chỉ  trả về kết quả cho  Pi-1 sau khi nhận được kết quả từ Pi+1.

5.      Trình bày ưu và nhược điểm của cơ chế định tuyến trong mạng phủ có cấu trúc.

6.      Cài đặt một máy chủ để cung cấp dịch vụ truyền tập tin, dịch vụ web.

 

 

 


CHƯƠNG 2:                   TRAO ĐỔI THÔNG TIN TRONG HỆ THỐNG PHÂN TÁN

Trao đổi thông tin giữa các tiến trình là trọng tâm của tất cả các hệ thống phân tán, do đó cần phải nghiên cứu kỹ lưỡng cách thức các tiến trình trao đổi thông tin với nhau. Thực chất, hệ thống phân tán sử dụng cơ chế truyền thông điệp do mạng máy tính đảm nhiệm, quá trình đó phức tạp hơn rất nhiều so với việc trao đổi thông tin giữa các tiến trình trên một máy tính. Các hệ thống phân tán hiện đại bao gồm hàng triệu tiến trình trao đổi thông tin với nhau qua mạng Internet không tin cậy, nếu không thay đổi các phương thức truyền thông nguyên thủy thì sẽ rất khó phát triển các ứng dụng phân tán. Về bản chất, trao đổi thông tin giữa các tiến trình vẫn sử dụng các giao thức truyền tin truyền thống đã qui định trong các tầng của mạng. Các giao thức này được ứng dụng để xây dựng các mô hình truyền tin khác như gọi thủ tục từ xa (RPC), gọi phương thức từ xa (RMI),  phần mềm trung gian hướng thông điệp (MOM). Mô hình truyền tin đầu tiên trong hệ thống phân tán là RPC, bản chất của nó là ẩn những thủ tục phức tạp trong việc truyền thông điệp và đó là cách lý tưởng trong các ứng dụng khách/chủ, sau này nó đã được cải tiến thành gọi đối tượng phân tán (DCOM).

Một số ứng dụng phân tán sử dụng phương thức truyền thông điệp, tính trong suốt của phương thức này khá thấp, do đó nên chuyển sang mô hình hàng đợi (tương tự như thư điện tử) hoặc sử dụng lớp phần mềm trung gian hướng thông điệp (MOM) để bảo đảm việc phân loại các thông điệp. Các dữ liệu đa phương tiện như âm thanh, hình ảnh ... đòi hỏi việc truyền tin cần phải đáp ứng yếu tố thời gian và tính liên tục, do đó mô hình truyền thông điệp dường như chưa đáp ứng được yêu cầu, khi đó phải sử dụng phương pháp truyền theo luồng. Vấn đề cuối cùng cần nghiên cứu là việc sử dụng phương pháp truyền thông điểm–điểm hay truyền thông theo nhóm. Truyền thông điểm-điểm sẽ chỉ có sự hiện diện của hai thành phần: bên gửi và bên nhận, truyền thông theo nhóm sẽ có nhiều thành phần cùng tham gia, như vậy vấn đề sẽ phức tạp hơn rất nhiều, không những nảy sinh các vấn đề về hiệu năng mà còn xuất hiện nhiều vấn đề khác cần phải giải quyết.

2.1       Cơ sở truyền thông

Trước khi đi vào chi tiết truyền thông trong các hệ thống phân tán chúng ta sẽ nhắc lại một số kiến thức cơ bản về các giao thức mạng và sau đó sẽ đề cập đến một số cách tiếp cận áp dụng chúng khi xây dựng các hệ thống phân tán.

2.1.1    Giao thức mạng

Các tiến trình trong hệ thống phân tán không dùng chung bộ nhớ, do đó việc trao đổi thông tin phải dựa hoàn toàn bằng phương pháp truyền thông điệp. Khi một tiến trình A muốn trao đổi thông tin với tiến trình B, nó tạo một thông điệp trong vùng nhớ riêng của mình và thực hiện lời gọi hệ thống, khi đó hệ điều hành sẽ thực hiện chức năng chuyển thông điệp qua mạng đến hệ điều hành của máy B và từ đó chuyển cho tiến trình B. Về nguyên lý thì đơn giản như vậy, trong thực tế quá trình này khá phức tạp bởi trong hệ thống phân tán có thể có các máy tính thuộc các nhà sản xuất khác nhau và sử dụng tiêu chuẩn mã hóa thông tin khác nhau.

Để khắc phục vấn đề này, tổ chức chuẩn hóa Quốc tế ISO đã đưa ra mô hình liên kết hệ thống mở OSI. Mặc dù các giao thức trong mô hình OSI ít được sử dụng, tuy nhiên đó là mô hình khá tốt để hiểu về mạng máy tính. Mô hình OSI được phân thành 7 tầng, mỗi tầng bao gồm các giao thức qui định khuôn dạng dữ liệu và các thủ tục xử lý như cách gửi/nhận đơn vị dữ liệu, cách xử lý khi xảy ra lỗi.

Hình  2.1 Mô hình liên kết hệ thống mở OSI

 

Mỗi tầng trong mô hình OSI thực hiện một số chức năng nhất định:

-         Tầng ứng dụng: Cung cấp giao diện phục vụ cho người sử dụng và các ứng dụng khác

-         Tầng trình diễn: Thực hiện mã hóa/giải mã, nén/giải nén và bảo mật dữ liệu.

-         Tầng phiên: Tạo ra các phiên làm việc.

-         Tầng giao vận: Tạo liên kết giữa đầu cuối với đầu cuối, điều khiển tốc độ truyền dữ liệu, xử lý lỗi truyền tin.

-         Tầng mạng: Quản lý địa chỉ logic của các đối tượng tham gia vào mạng, tìm đường đi tốt nhất cho mỗi gói tin.

-         Tầng liên kế dữ liệu: Thiết lập liên kết giữa hai thiết bị vật lý kề cạnh nhau

-         Tầng vật lý: Biến đổi các bit dữ liệu thành các tín hiệu phù hợp với môi trường truyền dẫn và thực hiện thu phát các tín hiệu đó.

Mặc dù mô hình OSI với những tiêu chuẩn qui định rất rõ ràng, nhưng nó chỉ để tham khảo, trong thực tế các mạng thường được xây dựng dựa trên mô hình TCP/IP, nó cũng là nền tảng của mạng Internet ngày nay. Xét trên khía cạch cách thiết lập liên kết giữa các thực thể truyền thông người ta phân ra hai loại giao thức:

-         Giao thức có liên kết: Cần phải thiết lập liên kết trước khi truyền dữ liệu, sau khi truyền xong thì phải hủy bỏ liên kết. Ưu điểm của loại này là tính tin cậy cao nhưng kèm theo đó lại là nhược điểm về hiệu năng.

-         Giao thức không liên kết: Không cần phải thiết lập liên kết trước khi truyền dữ liệu, như vậy hiệu năng sẽ cao hơn nhưng đổi lại độ tin cậy sẽ thấp hơn, tính tin cậy trong trường hợp này sẽ do các giao thức ở tầng trên đảm nhiệm,

Khi một tiến trình trên máy tính muốn gửi dữ liệu cho tiến trình trên máy tính khác, nó tạo một bản tin tại tầng ứng dụng và bản tin đó lần lượt được chuyển đến các lớp dưới trên máy tính đó. Khi đi qua mỗi tầng, thông tin điều khiển của giao thức tương ứng với tầng đó sẽ được thêm vào bản tin, quá trình đó gọi là bao đóng dữ liệu.

Hình 2.2: Bao đóng dữ liệu tại các lớp trong mô hình OSI

Ở chiều ngược lại, bên nhận sẽ nhận được luồng các bit từ mạng ở tầng vật lý, nó chuyển lần lượt qua các tầng, đến mỗi tầng lại bóc tách các thông tin điều khiển của giao thức tầng đó và chỉ chuyển phần dữ liệu cho tầng trên cho đến khi tầng ứng dụng nhận được sẽ là thông điệp gốc của bên gửi.

2.1.1.1     Các giao thức mức thấp

Các giao thức mức thấp hàm ý chỉ các giao thức thuộc ba tầng thấp nhất của mô hình OSI: tầng vật lý, tầng liên kết dữ liệu và tầng mạng. Tầng vật lý liên quan tới việc chuyển các bít dữ liệu, qui định các tiêu chuẩn cơ/điện và các giao diện kết nối đến đường truyền mạng, cách thể hiện các bit trên đường truyền vật lý. Tầng liên kết dữ liệu tập hợp các bit thành từng nhóm gọi là khung dữ liệu, phát hiện và sửa lỗi khi truyền các khung dữ liệu đó, nó đảm bảo truyền thông tin cậy giữa hai thiết bị kết nối trực tiếp với nhau. Trong mạng diện rộng, việc trao đổi thông tin giữa các máy tính phải chuyển qua nhiều thiết bị định tuyến, nhiệm vụ chính của các thiết bị này là duy trì bảng định tuyến và tìm đường đi tốt nhất cho mỗi gói tin, giao thức đang được sử dụng phổ biến nhất tại tầng mạng là giao thức IP, đây là giao thức thuộc loại không liên kết.

Như vậy các giao thức mức thấp chỉ đảm bảo vận chuyển dữ liệu một cách tốt nhất có thể được, nó không đảm bảo tính tin cậy, mặc dù tầng liên kết dữ liệu có chức năng đảm bảo truyền thông tin cậy giữa hai thiết bị kề cạnh nhau, nhưng không có gì đảm bảo dữ liệu được truyền tin cậy giữa hai thiết bị đầu cuối. Các gói tin hoàn toàn có thể bị thất lạc hoặc bị các thiết bị định tuyến hủy bỏ nếu nó không thể gửi đến thiết bị kế tiếp, độ tin cậy truyền thông giữa các ứng dụng sẽ do các giao thức tầng vận tải đảm nhiệm.

2.1.1.2     Giao thức tầng vận tải

Tầng vận tải là tầng thấp nhất trong ngăn xếp các giao thức cơ sở để người lập trình viên sử dụng khi phát triển các ứng dụng mạng. Chức năng cơ bản của tầng vận tải là quản lý việc trao đổi thông tin giữa các tiến trình trên các thiết bị đầu cuối của người sử dụng.

 

Hình 2.3 Qui trình truyền số liệu có liên kết

 

Tầng vận tải của mô hình TCP/IP cung cấp hai loại giao thức truyền thông, giao thức có liên kết TCP và giao thức không liên kết UDP. Đối với truyền số liệu có liên kết, tầng vận tải thực hiện các chức năng phát hiện, sửa lỗi và điều khiển tốc độ kênh truyền logic, do đó bên gửi và bên nhận cần phải thiết lập liên kết để thống nhất các tham số điều khiển. Các dịch vụ của tầng vận tải được cung cấp thông qua các cổng, số hiệu của các cổng do tổ chức IANA qui định.

2.1.1.3     Các giao thức mức cao

Các giao thức mức cao thuộc các tầng phía trên tầng vận tải, theo mô hình OSI nó bao gồm ba tầng: tầng phiên, tầng trình diễn và tầng ứng dụng. Ngoài ra, tùy theo yêu cầu phát triển hệ thống người ta có thể thêm một số các giao thức khác nhằm đơn giản hóa quá trình phát triển các sản phẩm phần mềm mạng, các giao thức đó được gộp chung vào nhóm tầng trung gian. Tầng phiên quản lý các phiên hội thoại giữa các tiến trình trên thiết bị đầu cuối mạng, tại tầng này người ta thiết kết các điểm kiểm tra nhằm hạn chế việc phải truyền lại toàn bộ dữ liệu khi xảy ra sự cố mất dữ liệu trên mạng. Tầng trình diễn thực hiện các nhiệm vụ mã hóa/giải mã dữ liệu nhằm thống nhất cách thể hiện các loại dữ liệu khác nhau của người sử dụng, ví dụ dùng bảng mã ASCII để mã hóa văn bản. Ngoài ra tầng này cũng thực hiện các chức năng khác như  nén/giải nén dữ liệu, mã hóa/giải mã bảo mật dữ liệu. Tầng ứng dụng bao gồm các giao thức phục vụ trực tiếp cho các dịch vụ của người sử dụng như: thư điện tử, truyền tập tin, truy nhập trang thông tin điện tử….

2.1.1.4     Giao thức tầng trung gian

Các giao thức tầng trung gian thường nằm tại tầng ứng dụng, nó bao gồm nhiều giao thức đa năng để đảm bảo tính độc lập với các ứng dụng, chúng thường được thể hiện dưới dạng các dịch vụ. Tùy theo yêu cầu sử dụng và khả năng phát triển, có thể xây dựng hệ thống phân tán theo cac mức độ: truyền tập tin, xử lý theo cơ chế khách/chủ thuần tuý, xử  lý theo cơ chế ngang hàng. Phương pháp truyền tập tin là mức đơn giản nhất trong các hệ thống phân tán, thông tin cần trao đổi giữa các đối tượng trong hệ thống được lưu dưới dạng tập tin, các máy tính phải cùng sử dụng một giao  thức để gửi và nhận tập tin.

Các giao thức tầng trung gian đơn giản hoá sự phức tạp trong việc truyền dữ liệu trên mạng, nhờ có các giao thức này mà việc gọi các thủ tục từ xa sẽ được thể hiện tương tự như gọi các thủ tục trên máy cục bộ. Đối chiếu với mô hình phân tầng OSI, tầng trung gian thể hiện các tính năng của nó trong tầng trình diễn và tầng phiên. Hiện nay có nhiều kiến trúc khác nhau dùng để thể hiện giao thức tầng trung gian như: Gọi thủ tục từ xa (RPC), kiến trúc môi trường yêu cầu đối tượng chung (CORBA), mô hình đối tượng thành phần phân tán (DCOM), gọi phương thức từ xa trong Java (RMI). Giải pháp RMI áp dụng riêng cho ngôn ngữ lập trình Java, nó sử dụng nhiều đặc tính của phương pháp gọi thủ tục từ xa RPC và kiến trúc CORBA. Tuy nhiên khi kiến trúc CORBA được đưa vào lõi của ngôn ngữ Java thì kiến trúc này sẽ dần thay thế RMI. Mô hình DCOM chỉ được ứng dụng trong các hệ thống cài đặt hệ điều hành của Microsoft và có hiều hạn chế trong việc thiết kế hệ thống.

Tầng trung gian đóng vai trò quan trọng trong việc xây dựng các hệ thống phân tán, việc thiết lập các tiêu chuẩn cho tầng trung gian nhằm mục đích cung cấp khả năng tương thích và tính mềm dẻo của các ứng dụng phân tán, nghĩa là phải chuẩn hoá giao diện lập trình ứng dụng và các giao thức trao đổi thông tin. Theo hai tiêu chí trên, tầng trung gian được chia thành bốn loại sau:

-         Tầng trung gian mở hoàn toàn: sử dụng giao diện lập trình ứng dụng và giao thức chung để trao đổi thông tin giữa các thành viên phân tán, các sản phẩm loại này đảm bảo khả năng tương tác với nhau mà không phụ thuộc nền tảng của mỗi thành viên trong hệ thống, ví dụ DCE RPC, CORBA, OpenDoc.

-         Tầng trung gian với giao diện lập trình ứng dụng mở: Cho phép các thành viên giao tiếp với nhau không phụ thuộc nền tảng hệ thống, các thành viên chỉ sử dụng chung các giao thức, ví dụ sản phẩm ODBC của Microsoft.

-         Tầng trung gian với giao thức mở: sử dụng giao thức chung nhưng cần phải chuyển đổi giao diện lập trình ứng dụng, ví dụ kiến trúc cơ sở dữ liệu quan hệ phân tán DRDA của IBM.

-         Tầng trung gian riêng: các ứng dụng phân tán chỉ giao tiếp với nhau khi sử dụng sản phẩm của một nhà cung cấp, ví dụ ActiveX/OLE.

2.1.2    Phân loại truyền thông

Để hiểu về các loại truyền thông mà tầng trung gian cung cấp cho các ứng dụng, chúng ta coi nó như một dịch vụ phụ trợ trong mô hình khách/chủ. Ví dụ hệ thống thư điện tử, bản chất của hệ thống này là dịch vụ truyền thông trung gian, trên mỗi máy của người dùng cài đặt phần mềm cho phép biên soạn, gửi và nhận thư điện tử. Người dùng biên soạn thư, gửi lên hệ thống phân phát thư điện tử và chờ đợi kết quả phân phát thư đó đến người nhận. Tương tự như vậy, người nhận kết nối đến hệ thống thư điện tử, kiểm tra xem có thư của mình hay không, nếu có thì hệ thống thư điện tử sẽ chuyển các bức thư đó tới máy của người dùng. Hệ thống thư điện tử là một ví dụ điển hình về phương pháp truyền thông bền bỉ, các thông điệp của người dùng được lưu trữ trong hệ thống cho đến khi chuyển thành công đến người nhận, bên gửi và bên nhận hoạt động hoàn toàn độc lập với nhau. Ngược lại, phương pháp truyền thông tạm thời  chỉ lưu giữ thông điệp trong thời gian gửi và nhận, nghĩa là bên gửi và bên nhận phụ thuộc lẫn nhau, nếu bên nhận không hoạt động thì các thông điệp sẽ bị hủy bỏ.

Hình 2.4 Nguyên lý truyền thông sử dụng tầng trung gian

 

Truyền thông cũng có thể được thực hiện dưới hình thức đồng bộ hoặc không đồng bộ. Trong phương thức truyền thông đồng bộ, bên gửi sẽ bị phong tỏa cho đến khi biết chắc chắn yêu cầu của mình đã được bên nhận xử lý. Phương pháp này đánh dấu ba thời điểm: Thời điểm thứ nhất bên gửi sẽ bị phong tỏa cho đến khi hệ thống trung gian tiếp nhận xong yêu cầu, thời điểm thứ hai hệ thống trung gian thông báo đã chuyển yêu cầu cho bên nhận và thời điểm thứ ban bên gửi sẽ tiếp nhận kết quả bên nhận xử lý. Ngược lại, truyền thông không đồng bộ cho phép bên gửi tiếp tục thực hiện công việc của mình sau khi đã gửi thông điệp đến hệ thống trung gian.

Trong thực tế người ta thường kết hợp hai loại truyền thông trên để trao đổi thông tin giữa các tiến trình, phương pháp truyền bền bỉ và đồng bộ thường được áp dụng trong các trường hợp cẩn phải chuyển một lượng lớn dữ liệu trong khi đó phương pháp truyền thông tạm thời và đồng bộ  sẽ chỉ phù hợp với lượng dữ liệu nhỏ, phươg pháp này thường sử dụng trong kỹ thuật gọi thủ tục từ xa. Bên cạnh tính bền bỉ và tính đồng bộ người ta còn phân biệt tính rời rạc hay liên tục của truyền thông, những hệ thống mà mỗi thông điệp được truyền đi là những đơn vị dữ liệu độc lập sẽ được xếp vào nhóm rời rạc, nếu các thông điệp được truyền lần lượt và liên tục gọi là phương pháp truyền tin theo luồng.

2.2       Gọi thủ tục từ xa

Nhiều hệ thống phân tán sử dụng phương pháp trao đổi trực tiếp các thông điệp giữa các tiến trình, quá trình này được thực hiện tường minh do đó không đáp ứng yêu cầu tính trong suốt truyền tin, các thủ tục gọi và nhận dữ liệu hoàn toàn không quan tâm đến quá trình trao đổi thông tin. Các khuyến nghị về phương pháp gọi thủ tục từ xa RPC đã được đưa ra từ năm 1975, nhưng mãi tới năm 1984  Birrell và Nelson mới đề xuất giải pháp hoàn toàn mới để thực hiện trao đổi thông tin bằng phương pháp này. Ý tưởng của phương pháp vẫn dựa vào qui trình gọi thủ tục, tuy nhiên điểm khác biệt nằm ở chỗ thủ tục đó được cài đặt trên một máy tính khác, người lập trình chỉ cần chuyển các giá trị vào các tham số của thủ tục. Về nguyên tắc, phương pháp này khá đơn giản cho việc cài đặt, tuy nhiên trong thực tế nảy sinh khá nhiều vấn đề như:  thực thi mã lệnh được thực hiện trên các vùng nhớ khác nhau hoặc nếu một trong hai máy tính bị lỗi trong quá trình thực thi mã lệnh cũng nảy sinh nhiều vấn đề phức tạp. Mặc dù vậy, phương pháp gọi thủ tục từ xa vẫn là phương pháp được áp dụng phổ biến nhất trong các hệ thống phân tán.

2.2.1    Cơ chế hoạt động

Phương pháp gọi thủ tục từ xa cho phép cài đặt các hệ thống phân tán theo mô hình khách/chủ: Các ứng dụng khách kết nối với máy chủ và sử dụng các dịch vụ do máy máy chủ cung cấp. Các bước gọi thủ tục trên máy chủ được thực hiện tương tự như gọi thủ tục trên máy cục bộ, máy khách chuyển các tham số đầu vào khi gọi thủ tục và dịch vụ trên máy chủ sẽ kiểm tra trính hợp lệ của các tham số đó, thực hiện tính toán và trả về các giá trị theo yêu cầu của ứng dụng máy khách. Để hiểu về phương pháp gọi thủ tục từ xa, trước hết chúng ta cần phải nhắc lại qui trình thực hiện khi gọi một thủ tục truyền thống trên một máy tính. Giả sử có một thủ tục đọc tập tin đơn giản như sau:

count = read(fd, buff, nbytes);

trong đó fd là con trỏ tập tin, buff  là vùng đệm, nbytes là số lượng byte cần đọc.

Hình 2.5 Gọi thủ tục trên một máy tính

 

Khi chương trình gọi thủ tục, nó tạo ra một ngăn xếp dành cho thủ tục đó. Để thực thi lời gọi thủ tục, nó truyền các tham số của thủ tục vào ngăn xếp theo thứ tự ngược, tham số đầu tiên sẽ được chuyển cuối cùng. Sau khi thực hiện xong thủ tục, giá trị trả về sẽ được chuyển tới các thanh ghi, giải phóng vùng nhớ và chuyển quyền điều khiển cho chương trình gọi, chương trình gọi sẽ loại bỏ tham số ra khỏi ngăn xếp, trả ngăn xếp về trạng thái như trước khi gọi thủ tục. Việc truyền tham số có thể được thực hiện bằng phương pháp truyền giá trị hay truyền dịa chỉ, nó có thể sử dụng cơ chế con trỏ hay tham chiếu.

Con trỏ đơn giản là địa chỉ của một đối tượng trong bộ nhớ, thông thường các đối tượng có thể được truy xuất trong hai cách: trực tiếp bởi tên đại diện hoặc gián tiếp thông qua con trỏ. Các biến con trỏ được định nghĩa trỏ tới các đối tượng của một kiểu cụ thể sao cho khi con trỏ hủy thì vùng nhớ mà đối tượng chiếm giữ được thu hồi. Các con trỏ thường được dùng cho việc tạo ra các đối tượng động trong thời gian thực thi chương trình. Không giống như các đối tượng bình thường được cấp phát lưu trữ trên ngăn xếp trong thời gian chạy, một đối tượng động được cấp phát vùng nhớ từ vùng lưu trữ khác gọi là heap. Truyền tham chiếu cung cấp một tên tượng trưng khác gọi là bí danh cho một đối tượng, truy xuất một đối tượng thông qua một tham chiếu giống như là truy xuất thông qua tên gốc của nó. Tham chiếu nâng cao tính hữu dụng của các con trỏ và sự tiện lợi của việc truy xuất trực tiếp các đối tượng, chúng được sử dụng để hỗ trợ các kiểu gọi thông qua tham chiếu của các tham số hàm đặc biệt khi các đối tượng lớn được truyền tới thủ tục. Như vậy quá trình gọi một thủ tục được thực hiện trên môi trường đồng nhất, trao đổi thông tin thông qua bộ nhớ, quá trình xử lý hoàn toàn dưới quyền điều khiển của bộ vi xử lý của máy tính đó.

 

Hình 2.6 Nguyên lý gọi thủ tục từ xa

 

Ý tưởng phương pháp gọi thủ tục từ xa là che giấu quá trình thực hiện thủ tục trên máy tính khác, điều này được thực hiện bằng cách che giầu quá trình trao đổi thông tin giữa các máy tính. Khi thực hiện gọi  thủ tục từ xa, một thành phần trên máy khách gọi là Stub sẽ bao bọc các tham số vào thông điệp và thông điệp đó phải được chuyển đến máy chủ. Tại máy chủ, một thành phần tương ứng với Stub gọi là Skeleton sẽ giải mã thông điệp đã nhận được và thực thi các mã lệnh như phương pháp gọi thủ tục truyền thống, kết quả thực hiện lại được chuyển vào thông điệp để trả về cho Stub. Stub trên máy khách sẽ giải mã thông điệp và trả về cho chương trình gọi các giá trị hoặc các tham số theo yêu cầu, quá trình xử lý giữa Stub và Skeleton hoàn toàn trong suốt đối với bên gọi thủ tục.

Để sử dụng tính năng gọi thủ tục từ xa, một chương trình trên máy chủ phải cung cấp các dịch vụ mô tả trong ngôn ngữ RPC. Mỗi máy chủ được gán tên và số chương trình, tất cả các dịch vụ được khai báo trong danh sách với đầy đủ các tham số thể hiện dịch vụ. Với nguyên tắc này, ngôn ngữ RPC cho phép thực hiện các kiểu dữ liệu đơn giản cũng như các dữ liệu phức tạp như: struct, enum... Qui trình thực hiện về cơ bản sẽ chỉ cần các bước sau:

-         Máy khách sử dụng tính năng gọi thủ tục cục bộ trong Stub.

-         Stub trên máy khách gửi các tham số đến máy chủ bằng cách gửi yêu cầu gọi thủ tục từ xa.

-         Yêu cầu của Stub được Skeleton trên máy chủ phân tích.

-         Thực hiện thủ tục đã được phân tích trên máy chủ.

-         Máy chủ trả về kết quả thực hiện cho máy khách

 

Hình 2.7 Các bước thực hiện trong gọi thủ tục từ xa

 

Phương pháp gọi thủ tục từ xa thể hiện quan điểm tách biệt giữa giao diện và phần cài đặt, xuất phát từ việc khai báo giao diện, phần mềm trung gian tạo các mã lệnh hỗ trợ cho việc xử lý phân tán bằng cách thể hiện các ứng dụng dưới dạng ngữ nghĩa truyền thống trên máy cục bộ, tuy nhiên nó phải đảm bảo nhiều nhiệm vụ phức tạp như: truyền dữ liệu, đồng bộ tiến trình. Như vậy bản chất của quá trình thực hiện gọi thủ tục từ xa được tách ra thành  mười bước chi tiết như sau:

1.      Thủ tục trên máy khách gọi stub như phương pháp gọi thủ tục truyền thống.

2.      Stub tạo thông điệp và chuyển đến hệ điều hành của máy khách .

3.      Hệ điều hành của máy khách gửi thông điệp đến hệ điều hành của máy chủ.

4.      Hệ điều hành của máy chủ chuyển thông điệp đến Skeleton .

5.      Skeleton giải mã thông điệp thành các tham số và gọi thủ tục xử lý tương ứng.

6.      Máy chủ thực hiện lời gọi thủ tục và trả về giá trị cho Skeleton.

7.      Skeleton đóng gói tham số giá trị trả về thành thông điệp và chuyển đến hệ điều hành của máy chủ.

8.      Hệ điều hành của máy chủ chuyển thông điệp đến hệ điều hành của máy khách.

9.      Hệ điều hành của máy khách nhận thông điệp và chuyển cho Stub.

10. Stub giải mã kết quả và trả về các tham số theo yêu cầu của thủ tục đã gọi.

Khác với gọi thủ tục trên một máy tính, gọi thủ tục từ xa phải di chuyển thông tin trên mạng, thời gian vận chuyển dữ liệu lâu hơn và tính tin cậy sẽ thấp hơn so với việc đọc/ghi bộ nhớ, nó có thể xảy ra trên môi trường không đồng nhất, do đó sẽ phát sinh một số vấn đề khác trong việc truyền tham số.

2.2.2    Vấn đề truyền tham số

Gọi thủ tục truyền thống có thể truyền giá trị hoặc truyền địa chỉ vì các tiến trình sử dụng chung bộ nhớ. Đối với việc gọi thủ tục từ xa, các tiến trình sở hữu bộ nhớ riêng, do đó không thể áp dụng phương pháp truyền  địa chỉ, vì vậy việc truyền địa chỉ trong gọi thủ tục từ xa chỉ là giả lập, do đó ưu điểm về hiệu năng sẽ không còn được duy trì trong phương pháp này. Mặt khác, truyền giá trị trở nên phức tạp đối với hệ thống phân tán không đồng nhất, các bộ vi xử lý của Intel theo định dạng little endian, trong khi các bộ vi xử lý của Sun theo định dạng  big endian, qui định lưu trữ các byte dữ liệu trong hai hệ thống này ngược nhau.

Hình 2.8 Truyền tham số trong các hệ thống không đồng nhất

 

Hình 2.9 Chuyển tham số vào thông điệp

 

Hình 2.8 minh họa ví dụ thủ tục từ xa gồm 2 thám số (5, “JILL”), các bit dữ liệu lần lượt được chuyển từ máy tính của hãng Intel sang máy tính của hãng Sun, khi đến máy Sun giá trị của các tham số theo thứ tự ngược và máy Sun sẽ hiểu số 5 là  5 x 224, như vậy chỉ cần đảo ngược thứ tự là sẽ nhận được kết quả ban đầu. Tuy nhiên, kiểu số nguyên mới cần đảo vị trí các byte nhưng dữ liệu kiểu xâu ký tự lại không cần thiết, do đó phải bổ sung thêm thông tin về kiểu dữ liệu của tham số. Con trỏ là kiểu dữ liệu đặc biệt, nó lưu trữ địa chỉ của một biến số mà địa chỉ đó chỉ có ý nghĩa bên trong một máy tính, như vậy không thể áp dụng phương pháp này để truyền tham số trong gọi thủ tục từ xa. Tuy nhiên, giải pháp truyền tham chiếu có thể thực hiện bằng cách tạo một biến tham chiếu tương ứng trên Skeleton và thủ tục trên máy chủ sẽ sử dụng địa chỉ của biến này như phương pháp truyền tham chiếu của một thủ tục thông thường.

Phương pháp gọi thủ tục từ xa che giấu quá trình trao đổi thông tin trên mạng bằng cách đưa các tham số vào thông điệp. Như vậy, cả phía máy khách và máy chủ đều phải tuân thủ quy tắc về định dạng tham số, đó là giao thức gọi thủ tục từ xa. Để đơn giản hóa quá trình tạo Stub cho máy khách và Scheleton cho máy chủ, một ngôn ngữ mới được sử dụng gọi là ngôn ngữ định nghĩa giao diện IDL. Lập trình viên chỉ việc viết các hàm và các thủ tục theo qui định của ngôn ngữ, sau đó dùng chương trình dịch để chuyển sang ngôn ngữ lập trình tương ứng.       

2.2.3    Các phương pháp gọi thủ tục từ xa

Tương tự như gọi thủ tục thông thường, gọi thủ tục từ xa có thể thực hiện bằng phương pháp đồng bộ hoặc không đồng bộ. Nếu sử dụng phương pháp gọi đồng bộ, tiến trình trên máy khách sẽ bị phong tỏa cho đến khi nhận được kết quả trả về, việc chờ đợi này đồng nghĩa với sự suy giảm hiệu năng của hệ thống.

Hình 2.10 Hai phương pháp gọi thủ thục từ xa

 

Hình 2.11 Gọi thủ tục từ xa bằng phương pháp không đồng bộ

 

Phương pháp gọi không đồng bộ cho phép tiến trình gọi trên máy khách gửi yêu cầu đến máy chủ, sau khi máy chủ xác nhận đã nhận được yêu cầu, tiến trình trên máy khách có thể tiếp tục xử lý các tác vụ khác mà không cần chờ đợi kết quả xử lý của máy chủ, như vậy sẽ rút ngắn thời gian phong tỏa hệ thống. Như vậy quá trình thực thi thủ tục trên máy chủ sẽ độc lập với tiến trình trên máy khách, sau khi hoàn thành, tiến trình trên máy chủ sẽ gọi tiến trình trên máy khách để trao kết quả trả về.

2.2.4    Đối tượng phân tán

Hiện nay việc xây dựng hệ thống phân tán dựa trên quan điểm xây dựng các đối tượng phân tán, mỗi ứng dụng phân tán bao gồm tập các đối tượng. Đặc điểm cơ bản của lập trình hướng đối tượng là việc che giấu xử lý bên trong, do đó những thay đổi bên trong đối tượng sẽ không ảnh hưởng đến các đối tượng khác. Một đặc tính quan trọng của đối tượng là tính bao đóng các thuộc tính và phương thức xử lý, thao tác với các thuộc tính của đối tượng đều phải được thực hiện thông qua các hàm giao diện. Khi máy khách gọi đối tượng từ xa, giao diện của đối tượng đó sẽ được nạp vào không gian địa chỉ của máy khách và đảm nhiệm vai trò tương tự như Stub trong phương pháp gọi thủ tục từ xa, nó đảm nhiệm chức năng chuyển đổi lời gọi các hàm giao diện thành dạng thông điệp để hệ điều hành chuyển đến máy chủ và ngược lại chuyển đổi thông điệp từ máy chủ thành kết quả trả về của hàm giao diện. Kế thừa ưu điểm của kỹ thật lập trình hướng đối tượng, để thuận tiện cho việc xây dựng hệ thống phân tán người ta đã nâng tầm phương pháp gọi  thủ tục từ xa thành phương pháp gọi đối tượng từ xa, ví dụ Java RMI, Microsoft DCOM, CORBA và dịch vụ web.

Đối tượng thực nằm ở phía máy chủ, nó có giao diện giống như trên máy khách và đồng thời một thành phần Skeleton có nhiệm vụ chuyển đối thông điệp từ phía máy khách thành lời gọi thủ tục tương ứng và sau đó chuyển kết quả thực hiện thành thông điệp để hệ điều hành chuyển tới máy khách. Các đối tượng phân tán liên quan đến vấn đề biên dịch, mà ngôn ngữ biên dịch lại phụ thuộc vào ngôn ngữ lập trình, do đó chúng phải xây dựng một cách tường minh, như vậy mới có thể xây dựng các ứng dụng dựa trên các ngôn ngữ lập trình khác nhau. Vấn đề cài đặt bên trong các đối tượng phân tán là công việc của các lập trình viên, điều quan trọng cần phải đảm bảo các tính thống nhất về mặt giao diện để các máy tính khác có thể gọi đối tượng đó. Giải pháp cho vấn đề này là xây dựng một thành phần thích nghi đối tượng để thể hiện các đối tượng phân tán trên môi trường mạng.

Việc gọi các đối tượng phân tán tương tự như gọi đối tượng trên một máy tính, điểm khác biệt cơ bản là trước khi gọi hàm của đối tượng phân tán cần phải nhúng đối tượng cục bộ vào đối tượng phân tán. Có thể thực hiện bằng cách gọi tường minh hoặc không tường minh. Khi gọi tường minh, cần phải khai báo biến con trỏ trên máy tính máy khách, sau đó gọi hàm bind để nhúng đối tượng phân tán vào biến con trỏ cục bộ.

Distr_object* obj_ref;      // Khai báo đối tượng tham chiếu toàn hệ thống

obj_ref = ...;                        //Khởi tạo biến tham chiếu cho đối tượng phân tán

obj_ref->do_something( );//Nhúng không tường minh, gọi hàm

Distr_object* obj_ref;      // Khai báo đối tượng tham chiếu toàn hệ thống

Localobject* obj_ptr;        // Khai báo biến con trỏ cho đối tượng cục bộ

obj_ref =...;                         // Khởi tạo biến tham chiếu cho đối tượng phân tán obj_ptr = bind(obj_ref);           // Nhúng đối tượng bằng phương pháp tường minh

obj_ptr->do_something( );// Gọi hàm

 

Ví dụ trên cho thấy hình thức gọi thủ tục từ xa không khác nhiều so với cách gọi thủ tục truyền thống,  chỉ cần thêm một bước là nhúng đối tượng trước khi gọi các thủ tục. Sự khác biệt nằm ở bên trong quá trình thực hiện, dữ liệu được lưu chuyển trên mạng, do đó cần hạn chế tối đa việc phải thiết lập/hủy bỏ kênh truyền và giảm thiểu lượng thông tin cần trao đổi để nâng cao hiệu năng của hệ thống.

2.3       Truyền thông điệp

Phương pháp gọi thủ tục từ xa hay phương pháp gọi đối tượng từ xa có ưu điểm là che giấu quá trình trao đổi thông tin trong hệ thống phân tán, góp phần nâng cao tính trong suốt của hệ thống. Cơ chế gọi thủ tục từ xa đòi hỏi tiến trình cung cấp dịch vụ phải luôn ở trạng thái sẵn sàng tiếp nhận yêu cầu gọi, điều này không phải lúc nào cũng đạt được. Nếu sử dụng phương thức đồng bộ để gọi thủ tục từ xa thì tiến trình trên máy khách sẽ bị phong tỏa, hơn nữa tiến trình trên máy khách đều phải chuyển toàn bộ các tham số sang tiến trình máy chủ, nếu lượng dữ liệu lớn hoặc tốc độ kênh truyền thấp thì thời gian vận  chuyển quá lâu sẽ phát sinh lỗi quá thời gian. Như vậy việc gọi thủ tục từ xa sẽ chỉ phù hợp cho các tác vụ với dữ liệu nhỏ và thời gian thực hiện nhanh, thông thường phải đảm bảo thời gian đáp ứng không quá 600 ms, do đó phải có những dịch vụ truyền thông khác thay thế khi cần thiết.  

2.3.1    Các phương pháp truyền thông điệp

Mỗi máy tính trên mạng cung cấp giao diện trao đổi thông điệp, khi cần chuyển thông điệp đến một máy tính khác, tiến trình bên gửi chỉ cần chuyển các thông điệp đó đến giao diện, công việc tiếp theo sẽ do hệ điều hành thực hiện và đảm bảo sẽ chuyển tới giao diện thông điệp của bên nhận.  Xét về tính tin cậy, truyền thông điệp có thể thực hiện bằng hai phương pháp:

-         Truyền thông nhất thời: Thông điệp chỉ được lưu trong thời gian thực hiện chuyển thông tin, nếu không thành công thì thông điệp đó sẽ bị hủy bỏ.

-         Truyền thông bền bỉ: Thông điệp được lưu tại bộ đệm cho đến khi toàn bộ thông điệp đã gửi thành công cho bên nhận.

Chuyển thông điệp bền bỉ tương tự như tổ chức mạng lưới bưu chính,  bưu phẩm được chuyển đến các bưu cục và người đưa thư có nhiệm vụ chuyển các bưu phẩm đó đến người nhận, quá trình này có thể phải được chuyển qua một hoặc nhiều bưu cục. Xét về cách thức gửi/nhận, truyền thông điệp có thể được thực hiện bằng hai phương pháp:

-         Truyền thông đồng bộ: Bên gửi sẽ tạm ngừng tiến trình cho đến khi toàn bộ thông điệp được chuyển thành công đến vùng đệm của bên nhận.

-         Truyền thông không đồng bộ: Bên gửi chỉ bị tạm ngừng trong thời gian chuyển thông điệp đến vùng đệm gửi.

Trong thực tế, để truyền thông điệp có thể tổ hợp các phương pháp trên, như vậy có bốn khả năng xảy ra:

         Truyền thông đồng bộ, nhất thời

         Truyền thông đồng bộ, bền bỉ

         Truyền thông không đồng bộ, nhất thời

        Truyền không đồng bộ, nhất thời, dựa trên vùng đệm của bên nhận

        Truyền không đồng bộ, nhất thời, dựa trên vùng đệm của bên gửi

        Truyền không đồng bộ, nhất thời, dựa trên phản hồi của bên nhận

         Truyền thông không đồng bộ, bền bỉ

Hầu hết các hệ thống phân tán lựa chọn phương pháp truyền thông không đồng bộ, nhất thời và dựa trên phản hồi của bên nhận, như vậy có thể đảm bảo tính tin cậy nhưng không làm suy giảm hiệu năng của hệ thống.

2.3.2    Truyền thông điệp nhất thời

Nhiều ứng dụng trên các hệ thống phân tán được xây dựng dựa trên dịch vụ truyền thông điệp của tầng vận tải.  Theo mô hình mạng TCP/IP, mạng máy tính được phân làm 4 tầng, để đảm bảo tính duy nhất mỗi thông điệp của một tiến trình sẽ được chuyển đến cổng đã cấp cho tiến trình, số hiệu cổng và địa chỉ logic của máy tính gọi là socket. Để tạo điều kiện thuận lợi cho việc phát triển phần mềm trên hệ thống phân tán, mô hình TCP/IP đã qui định một số hàm nguyên thủy.

2.3.2.1     Các hàm nguyên thủy

Việc chuẩn hóa giao diện tầng vận tải cho phép lập trình viên sử dụng các hàm nguyên thủy để truyền tin giữa các tiến trình trên các máy tính khác nhau một cách dễ dàng hơn. Vào những năm 1970,  hãng IBM đưa ra giao diện socket trong hệ điều hành Berkeley UNIX, hãng AT&T để xuất giao diện XTI (viết tắt của X/Open Transport Interface). Cả sockets lẫn XTI rất giống nhau về cách lập trình mạng nhưng khác nhau về tập hợp nguyên thủy của chúng. Về nguyên lý, socket là một điểm cuối truyền thông để tiến trình bên gửi ghi dữ liệu sẽ được chuyển qua mạng đến điểm kết cuối bên nhận và từ đó dữ liệu sẽ được tiến trình bên nhận đọc. Socket trừu tượng hóa truyền thông thực tế giữa các điểm cuối và được hệ điều hành sử dụng cho các giao thức tầng vận tải. Các hàm nguyên thủy bao gồm:

Hàm

Ý nghĩa

Socket

Tạo điểm cuối truyền thông mới

Bind

Gắn địa chỉ cục bộ vào socket

Listen

Thông báo sẵn sạng nhận thông tin

Accept

Tiếp nhận yêu cầu liên kết, phong tỏa đối tượng gọi cho đến khi có yêu cầu kết nối gửi đến

Connect

Thiết lập liên kết

Send

Gửi dữ liệu trên kênh logic đã được thiết lập

Receive

Nhận dữ liệu trên kênh logic đã được thiết lập

Close

Hủy bỏ liên kết

 

Máy chủ thường thực hiện bốn nguyên thủy đầu tiên, khi gọi hàm Socket(), đối tượng gọi tạo ra một điểm cuối truyền thông mới cho một giao thức tầng vận tải. Việc tạo ra một điểm cuối truyền thông nghĩa là hệ điều hành cục bộ dự trữ tài nguyên để đáp ứng yêu cẩu gửi và nhận các thông điệp cho giao thức đã xác định. Hàm Bind() liên kết địa chỉ cục bộ với socket mới được tạo, nó nhúng địa chỉ IP của máy với số hiệu cổng với nhau vào socket để hệ điều hành biết điểm kết cuối muốn nhận thông báo trên địa chỉ và cổng đã xác định. Hàm Listen() thuộc loại không phong toả và chỉ sử dụng trong truyền thông có liên kết, thông báo cho hệ điều hành cục bộ dành bộ đệm đủ  cho một số lượng  kết nối tối đa  sẵn sàng chấp nhận. Hàm Accept() phong tỏa đối tượng gọi cho đến khi có yêu cầu kết nối. Khi một yêu cầu gửi đến, hệ điều hành cục bộ sẽ tạo một  socket mới với các thuộc tính giống như socket ban đầu và trả lại cho bên gọi. Cách tiếp cận này cho phép máy chủ tách biệt tiến trình để sau đó sẽ xử lý truyền tin qua kết nối mới, máy chủ có thể quay lại và đợi một yêu cầu kết nối khác trên socket ban đầu.

Hình 2.12 Sử dụng hàm nguyên thủy trong truyền thông đồng bộ

 

Về phía máy khách, trước tiên phải tạo một điểm cuối bằng cách sử dụng hàm Socket(), không cần thiết phải nhúng địa chỉ và số hiệu cổng vì hệ điều hành tự động gán cổng khi thiết lập liên kết. Hàm Connect() đòi hỏi địa chỉ và số hiệu cổng mà yêu cầu kết nối sẽ gửi đến, tiến trình máy khách bị phong tỏa cho đến khi thiết lập thành công, sau đó cả hai bên có thể bắt đầu trao đổi thông tin bằng cách sử dụng các hàm Send() và Receive(). Sau khi gửi và nhận dữ liệu, hai bên có thể đóng kết nối bằng cách gọi hàm Close().

2.3.2.2     Giao diện chuyển thông điệp

Truyền thông điệp nhất thời sử dụng các hàm nguyên thủy có mức độ trừu tượng thấp, nó chỉ đơn thuần cung cấp các hàm gửi/nhận, do đó lập trình viên phải tốn nhiều công sức trong việc phát triển phần mềm. Hơn nữa, các socket chỉ đáp ứng yêu cầu truyền thông trong các mạng mô hình TCP/IP, nó không phù hợp với các giao thức độc quyền dành riêng cho các mạng tốc độ cao, ví dụ kết nối mạng các mạng máy chủ cụm với tốc độ truyền tin năng cao. Các thiết bị mạng có hiệu năng cao phải được gắn kèm với thư viện do nhà sản xuất cung cấp, nhiều khi các thư viện này không tương thích với nhau, nảy sinh vấn đề về tính khả chuyển của hệ thống.

Nhu cầu độc lập về nền tảng đã dẫn đến việc định nghĩa một tiêu chuẩn cho việc truyền thông điệp, được gọi đơn giản là giao diện chuyển thông điệp (MPI - Message-Passing Interface). MPI được thiết kế cho các ứng dụng song, phù hợp với nhu cầu truyền thông nhất thời, nó sử dụng trực tiếp mạng cơ bản. Các lỗi như sự cố tiến trình hoặc mất đường tuyền mạng bị coi là nghiêm trọng và MPI không yêu cầu phục hồi tự động.

MPI giả thiết trao đổi thông tin diễn ra trong một nhóm các tiến trình đã biết, mỗi nhóm có một định danh và tiến trình trong nhóm cũng có định danh, cặp định danh của nhóm và tiến trình xác định duy nhất nguồn hoặc đích của thông điệp, chúng được sử dụng thay cho địa chỉ tầng vận tải. Các nhóm và các tiến trình có thể chồng nhau và chúng đều có thể hoạt động song song. Hạt nhân của MPI là các hàm nguyên thủy hỗ trợ truyền thông nhất thời, những hàm cơ bản nhất  bao gồm:

Hàm

Ý nghĩa

MPI_bsend

Thêm thông điệp vào vùng đệm gửi

MPI_send

Gửi thông điệp và chờ cho đến khi toàn bộ thông điệp đã được chuyển đến vùng đệm cục bộ hoặc bên nhận khởi tạo thao tác nhận

MPI_ssend

Gửi thông điệp và chờ cho đến khi bên nhận bắt đầu thực hiện việc nhận thông điệp

MPI_sendrecv

Chuyển thông điệp và chờ cho đến khi có xác nhận của bên nhận

MPI_isend

Tham chiếu đến thông điệp đang chở gửi

MPI_issend

Tham chiếu đến thông điệp đang chở gửi và chờ cho đến khi bên nhận bắt đầu

MPI_recv

Nhận thông điệp, phong tỏa nếu không có thông điệp

MPI_irecv

Nhận thông điệp, không phong tỏa nếu không có thông điệp

Hàm MPI_bsend hỗ trợ truyền thông nhất thời không đồng bộ, thông điệp của bên gửi được sao chép vào vùng đệm cục bộ, sau khi sao chép xong thì tiến trình gửi có thể tiếp tục công việc khác. Hệ thống MPI cục bộ sẽ xóa thông báo khỏi bộ đệm cục bộ của nó và xử lý việc truyền tải ngay sau khi bên nhận gọi hàm nhận. Hàm MPI_send có thể phong tỏa tiến trình gửi cho đến khi thông điệp được sao chép vào hệ thống MPI  hoặc cho đến khi bên nhận khởi tạo thao tác nhận. Hàm MPI_ssend  hỗ trợ truyền thông đồng bộ, khi đó tiến trình gửi bị phong tỏa cho đến khi yêu cầu của nó được chấp nhận để xử lý tiếp. Hình thức truyền thông đồng bộ mạnh nhất được hỗ trợ khi bên gửi gọi hàm MPI_sendrecv, nó sẽ gửi yêu cầu đến bên nhận và bị phong tỏa cho đến khi bên nhận trả lời, về cơ bản hàm này tương ứng với gọi thủ tục từ xa.

Hai hàm MPI_send và MPI_ssend đều có các biến thể, chúng sử dụng con trỏ để tránh sao chép thông điệp từ bộ đệm người dùng sang bộ đệm của hệ thống MPI cục bộ, các biến thể này tương ứng với hình thức truyền thông không đồng bộ. Sử dụng hàm MPI_isend, tiến trình gửi chuyển con trỏ đến thông điệp để MPI sẽ xử lý truyền thông, sau đó ngay lập tức tiếp tục công việc khác. Nhằm ngăn chặn việc ghi đè thông điệp trước khi quá trình truyền thông hoàn tất, MPI cung cấp các hàm kiểm tra xem đã hoàn thành hoặc thậm chí phong tỏa nếu được yêu cầu. Đối với MPI_send, thông điệp đã thực sự được chuyển đến bên nhận hay mới chỉ được sao chép vào vùng đệm của  MPI vẫn chưa được xác định. Tương tự như vậy, với MPI_issend, bên gửi cũng chỉ chuyển một con trỏ đến hệ thống MPI. Khi hệ thống MPI cho biết thông điệp đã được xử lý, tiến trình gửi biết rằng bên nhận đã chấp nhận và hiện đang xử lý tin nhắn đó.

Hàm MPI_recv dùng để nhận thông điệp, nó phong tỏa tiến trình gọi cho đến khi có thông điệp. Hàm MPI_irecv phục vụ cho truyền thông không đồng bộ, bên nhận có thể kiểm tra xem một tin nhắn đã thực sự đến hay chưa nhưng không phong tỏa tiến trình gọi, nó chỉ đơn thuần thông báo bên nhận đã sẵn sàng. Ngữ nghĩa của các hàm MPI không phải lúc nào cũng cứng nhắc, các hàm khác nhau đôi khi có thể được thay thế cho nhau mà không ảnh hưởng đến tính đúng đắn của chương trình. Lý do chính thức tại sao rất nhiều hình thức truyền thông khác nhau được hỗ trợ là nó cung cấp cho những người triển khai các hệ thống MPI đủ khả năng để tối ưu hóa hiệu năng hệ thống. MPI đã được thiết kế cho các ứng dụng song song hiệu suất cao, giúp dễ hiểu hơn về tính đa dạng của nó trong các hàm truyền thông khác nhau.

2.3.3    Truyền thông điệp bền bỉ

Hệ thống hàng đợi thông điệp hỗ trợ đắc lực cho việc trao đổi thông tin không đồng bộ, các tiến trình không cần phải ở trạng thái hoạt động khi truyền tin, tuy nhiên thời gian trễ có thể lên tới vài phút. Các tiến trình trao đổi thông tin với nhau bằng cách đưa tin nhắn vào hàng đợi, trách nhiệm chuyển các thông điệp tới đích sẽ thuộc về máy chủ truyền thông. Về nguyên tắc, mỗi tiến trình có một hàng đợi riêng để nhận thông điệp do các tiến trình khác gửi đến, tuy nhiên cũng có thể nhiều tiến trình cùng chia sẻ một hàng đợi. Hệ thống chỉ đảm bảo thông điệp của bên gửi được đưa vào hàng đợi cho bên nhận mà không cam kết về thời gian cũng như việc bên nhận có đọc hay không, việc đó hoàn toàn phụ thuộc vào cách xử lý của bên nhận. Trao đổi thông tin không ràng buộc chặt chẽ giữa các bên, thông điệp không cần phải xử lý ngay sau khi nhận và bên gửi cũng không bị phong tỏa trong thời gian chuyển thông điệp, các tiến trình hoạt động hoàn toàn độc lập với nhau. Khi thông điệp đã được đưa vào hàng đợi, nó sẽ vẫn ở đó cho đến khi bị xóa, bất kể bên gửi hay bên nhận có đang hoạt động hay không, điều này cho thấy bốn khả năng xảy ra như trong hình 2.13.

Hình 2.13 Tổ hợp liên kết lỏng trong mô hình hàng đợi thông điệp

 

Trường hợp thứ nhất, cả bên nhận và gửi đều đang chạy trong toàn bộ thời gian truyền thông điệp. Trường hợp thứ hai, bên gửi đang chạy nhưng bên gửi lại ở trạng thái thụ động, nghĩa là không thể phân phát được thông điệp nhưng bên gửi vẫn có thể tiếp tục gửi. Trường hợp thứ ba, bên nhận đang chạy nhưng bên nhận lại ở trạng thái thụ động, nghĩa là bên nhận đọc thông điệp trong hàng đợi nhưng không biết bên gửi có đang hoạt động hay không. Trường hợp thứ tư, cả bên nhận và bên gửi đều ở trạng thái tự động, nghĩa là thông điệp vẫn được hệ thống lưu trữ lại hoặc đang chuyển đi ngay cả khi bên gửi và bên nhận không còn hoạt động nữa. Về nguyên tắc, thông điệp có thể chứa bất kỳ loại dữ liệu nào, điều quan trọng là phần mềm trung gian phải đảm bảo phân phát thông điệp chính xác, điều này được thực hiện bằng hệ thống định danh duy nhất trong hàng đợi. Trong một số trường hợp kích thước của thông điệp có thể bị giới hạn mặc dù hệ thống hàng đợi thông điệp có thể chia nhỏ thông điệp khi gửi và tập hợp chúng lại ở bên nhận, quá trình này hoàn toàn trong suốt đối với phần mềm ứng dụng. Như vậy, hệ thống hàng đợi thông điệp chỉ cần phải cung cấp bốn hàm cơ bản cho phần mềm ứng dụng như sau:

Tên hàm

Ý nghĩa

Put

Thêm thông điệp vào hàng đợi đã xác định

Get

Phong tỏa cho đến khi hàng đợi không rỗng và xóa thông điệp đầu tiên

Poll

Kiểm tra thông điệp có trong hàng đợi hay không và xóa thông điệp đầu tiên, không phong tỏa tiến trình gọi

Notify

Cài đặt trình điều khiển để thông báo khi thông điệp được đặt vào hàng đợi

 

Bên gửi sử dụng hàm Put() để chuyển thông điệp vào hệ thống, nó sẽ được thêm vào hàng đơi, hàm này không phong tỏa tiến trình gọi. Hàm Get() thuộc loại phong tỏa, tiến trình được ủy quyền có thể xóa thông điệp đang chờ lâu nhất trong hàng đợi, tiến trình gọi sẽ chỉ bị phong tỏa nếu hàng đợi rỗng. Hàm Poll() lấy thông điệp từ hàng đợi, nếu không tìm thấy thông điệp thì tiến trình gọi sẽ tiếp tục thực hiện, nghĩa là nó không bị phong tỏa. Cuối cùng là hàm Notify(), nhiều hệ thống hàng đợi cho phép tiến trình cài đặt bộ điểu khiển tương tự như hàm gọi lại, nó sẽ tự động được kích hoạt khi có thông điệp đưa vào hàng đợi. Cơ chế này cũng cho phép tự động khởi tạo một tiến trình nếu như không có thành viên nào đang hoạt động, giải pháp này thường được cài đặt dưới dạng tiến trình giám sát hàng đợi ở bên nhận.

2.4       Truyền thông luồng

Truyền thông bằng cách gọi thủ tục từ xa hay truyền thông điệp mới chỉ chú trọng đến việc chuyển dữ liệu mà chưa đề cập đến loại dữ liệu cần chuyển, thời gian thực hiện, tính liên tục và yêu cầu đồng bộ. Gọi một thủ tục từ xa hoặc truyền thông điệp không phụ thuộc vào thời điểm thực hiện, dù thời gian thực hiện có thể nhanh hay chậm cũng không ảnh hưởng đến tính chính xác của dữ liệu. Truyền tin yêu cầu thời gian thực phải được thực hiện với độ trễ thấp nhất có thể nhưng vẫn phải đáp ứng các tiêu chuẩn về chất lượng dịch vụ.

Ví dụ khi truyền âm thanh, tai người có thể nhận biết được âm thành tần số từ 30 đến 20000 Hz, theo định luật lấy mẫu của Nyquist thì tần số lấy mẫu phải là 44100 Hz, đó cũng là tiêu chuẩn CD 16 bit/44100 Hz bên gửi ghi lại âm tranh và gửi lên mạng, bên nhận tổng hợp lại luồng bit để khôi phục âm thanh bên gửi thì cũng phải đảm bảo tần số trên, rất tiếc tốc độ truyền thông trên mạng thường không ổn định do đó dẫn tới hiện tượng méo âm. Các dịch vụ đa phương tiện bao gồm nhiều luồng dữ liệu khác nhau như văn bản, âm thanh, hình ảnh…, chúng đòi hỏi tính đồng bộ giữa các luồng dữ liệu và đồng thời sự liên tục của thông tin cũng là thước đo của chất lượng dịch vụ, vì vậy hệ thống phân tán phải có giải pháp để có thể cung cấp các dịch vụ phụ thuộc vào thời gian.

2.4.1    Hỗ trợ truyền thông liên tục

Các phương tiện hỗ trợ trao đổi thông tin phụ thuộc thời gian bao gồm thiết bị lưu trữ, môi trường truyền dẫn và các thiết bị thể hiện thông tin. Mỗi loại thông tin có các tiêu chuẩn mã hóa riêng,  văn bản có kiểu mã hóa ASCII hoặc Unicode, hình ảnh được mã hóa theo chuẩn JPEC hoặc GIF, âm thanh được mã hóa theo chuẩn lấy mẫu 16 bit PCM, video được mã hóa theo tiêu chuẩn H.265 hoặc  MPEG-4. Khi thể hiện dữ liệu, những dữ liệu không liên tục như văn bản hoặc ảnh tĩnh thì chỉ cẩn đảm bảo thứ tự hiển thị, nhưng đối với thông tin liên tục, quan hệ nhịp độ giữa các mục dữ liệu là vấn để cơ bản để biên dịch luồng dữ liệu thành những thông tin chính xác, nó không những phải đảm bảo chính xác về thứ tự mà tần suất thể hiện cũng phải cố định.

Để trao đổi thông tin phụ thuộc thời gian, hệ thống phân tán sử dụng luồng dữ liệu, bản chất đó là chuỗi các đơn vị dữ liệu rời rạc, trong khi đó việc thể hiện loại dữ liệu này cần phải đảm bảo tính liên tục. Thời gian là nhân tố đóng vai trò quan trọng trong luồng dữ liệu liên tục, phương thức truyền đồng bộ có thể đảm bảo về mặt thứ tự nhưng không ràng buộc về thời gian. Phương thức truyền đồng bộ qui định thời gian trễ tối đa cho mỗi đơn vị dữ liệu trong luồng, thời gian truyền thực tế có thể nhỏ hơn rất nhiều giá trị cho phép, nhưng điều quan trọng là nó không được phép lớn hơn khoảng thời gian giữa các lần lấy mẫu. Hệ thống phân tán sử dụng phương thức truyền đẳng thời để thể hiện dữ liệu loại âm thanh hoặc video, các đơn vị dữ liệu phải được chuyển đúng thời gian, nghĩa là phải đảm bảo ngưỡng thời gian tối đa và tối thiểu từ đầu cuối đến đầu cuối.

 

Luồng dữ liệu có thể là đơn hoặc phức hợp, nếu nó chỉ gồm một loại thông tin thì đó là luồng đơn, nếu luồng dữ liệu được cấu thành từ nhiều luồng con và mỗi luồng con thể hiện một loại thông tin thì gọi là luồng phức hợp. Ví dụ, luồng dữ liệu phim ảnh thông thường sẽ được gồm một luồng hình ảnh và hai luồng âm thanh, nhưng nếu có phụ đề thì cần luồng thứ tư là văn bản. Như vậy luồng dữ liệu phức hợp không những phải đảm bảo tính liên tục trong mỗi luồng con mà còn cần phải duy trì tính đồng bộ giữa các luồng con với nhau. Vấn đề sẽ phức tạp hơn nếu bên gửi phát trực tiếp, nghĩa là nó không sử dụng không gian lưu trữ, như vậy cơ hội điều khiển luồng sẽ ít hơn. Để đơn giản, hệ thống phân tán chỉ xét trường hợp phát dữ liệu từ một không gian lưu trữ như vậy có thể phác thảo lưu đồ xử lý như hình trên. Dữ liệu được nén để giảm dung lượng lưu trữ cũng như khi lưu chuyển trên mạng, phải xây dựng các thành phần để xử lý các vấn đề về kiểm soát chất lượng và đồng bộ.

2.4.2    Luồng và chất lượng dịch vụ

Các yêu cầu về thời gian nói chung được thể hiện bằng những yêu cầu chất lượng dịch vụ, nó mô tả những điều cần thiết trong nền tảng của hệ thống phân tán để bảo toàn quan hệ giữa các mục dữ liệu luồng. Từ quan điểm của một ứng dụng, cần phải xác định một số tiêu chuẩn quan trọng sau:

         Tốc độ chuyển dữ liệu: Lượng dữ liệu thực tế được chuyển đi trong một đơn vị thời gian, nó không những bị hạn chế bởi băng thông mà còn bị ảnh hưởng nhiều yếu tố khác như số lượng người dùng, ảnh hưởng của môi trường…

         Độ trễ tối đa để thiết lập liên kết: Thời gian kể từ khi đưa ra yêu cầu cho đến khi hoàn thành thiết lập phiên làm việc, nghĩa là một ứng dụng có thể bắt đầu gửi dữ liệu

         Độ trễ tối đa từ đầu cuối đến đầu cuối: Thời gian vận chuyển một đơn vị dữ liệu từ tiến trình gửi đến tiến trình nhận.

         Biên độ tối đa thay đổi độ trễ: Phương sai độ trễ lớn nhất, nó thể hiện tính ổn định của đường truyền mạng.

         Độ trễ toàn phần: Giá trị trễ lớn nhất kể từ khi gửi đơn vị dữ liệu cho đến khi nhận được bản tin phản hồi.

Các tiêu chuẩn trên không phải là bất biết, hệ thống phân tán hiện nay hầu hết đều được xây dựng dựa trên nền tảng của mô hình TCP/IP, mạng có thể loại bỏ bất kỳ gói tin nào khi không thể vận chuyển được đến thiết bị kế tiếp. Bản thân mô hình này cũng đã qui định một loạt các tiêu chuẩn về chất lượng dịch vụ, tuy nhiên thực tế chúng ít khi được triển khai, do đó hệ thống phân tán phải giải quyết những vấn đề chất lượng dịch vụ truyền thông kém.

Cách giải quyết thứ nhất là thiết lập giá trị ưu tiên trong gói tin IP, khi  đó chúng sẽ được các tiết bị định tuyến xử lý với độ trễ thấp nhất và độ tin cậy cao nhất có thể đạt được. Cách thứ hai là sử dụng bộ đệm để loại bỏ tính không ổn định của truyền thông, dữ liệu nhận được sẽ đưa vào vùng đệm, kích thước vùng đệm được tính toán sao cho đủ khả năng đảm bảo hiển thị thông tin liên tục. Ví dụ trong hình vẽ minh họa, bên gửi lần lượt chuyển 8 gói tin lên mạng, nhận được gói tin số 6, bên nhận tính toán chỉ cần đặt kích thước vùng đệm đủ cho 7 gói tin, khi đó nó bắt đầu hiển thị thông tin. Thật không may khi đã hiển thị gói tin số 7 nhưng gói tin số 8 vẫn chưa đến, điều này sẽ làm gián đoạn hiển thị, giải pháp duy nhất ở đây là tăng kích thước vùng đệm.

Nếu một gói tin bị hủy bỏ, bên nhận có thể yêu cầu gửi lại, nhưng điều này không nằm trong cơ chế hoạt động của giao thức IP, do đó cần phải áp dụng kỹ thuật sửa lỗi chuyển tiếp. Bên gửi sẽ mã hóa các gói dữ liệu để bên nhận có thể tái tạo lại K gói tin bị mất trên tổng số N gói tin nhận được. Nếu một gói tin chứa nhiều khung hình âm thanh hoặc hình ảnh, khi gói tin bị mất sẽ để lộ một khoảng trống khá lớn, do đó có thể sử dụng kỹ thuật trộn bằng cách đan xen các khung như thể hiện trên hình vẽ, các khung bị mất sẽ không liên tục, điều đó tạo điều kiện cho thuật toán sửa lỗi có thể phục hồi những khung đó, tuy nhiên giải pháp này đòi hỏi phải sử dụng bộ đệm  lớn hơn và độ trễ cũng sẽ tăng theo.

2.4.3    Đồng bộ luồng

Một vấn đề quan trọng trong các hệ thống đa phương tiện là các luồng phức hợp, cần phải đồng bộ các luồng con để duy trì mối quan hệ nhịp độ giữa các luồng. Dạng đơn giản nhất là đồng bộ luồng dữ liệu rời rạc với luồng dữ liệu liên tục, ví dụ trình chiếu kèm âm thanh, phức tạp hơn là đồng bộ dữ liệu của các luồng liên tục, ví dụ phim ảnh sẽ phải đồng bộ âm thanh với hình ảnh động. Việc đồng bộ được thực hiện ở mức độ đơn vị dữ liệu của luồng, kích thước đơn vị dữ liệu phụ thuộc vào mức độ trừu tượng hóa để luồng dữ liệu thể hiện thông tin. Ví dụ luồng dữ liệu âm thanh CD 16 bit với tần số lấy mẫu 44100 Hz, về mặt lý thuyết thì đồng bộ với các luồng âm thanh khác có thể diễn ra khoảng 22.6757369615 µs một lần, đối với các hiệu ứng âm thanh nổi chất lượng cao thì việc đồng bộ hóa ở cấp độ này là thực sự cần thiết. Khi xem xét đồng bộ hóa luồng âm thanh với luồng video theo chuẩn NTSC với tần số 29,97 Hz, khoảng thời gian đồng bộ là 33366.7000333667 µs, một đơn vị âm thanh có thể lên tới 1471 mẫu, nghĩa là đơn vị dữ liệu có kích thước khoảng 11768 byte.

Quá trình đồng bộ hóa cần xem xét các cơ chể cơ bản để đồng bộ hóa hai luồng và cách phân bố các cơ chế đố trong môi trường mạng. Cơ chế đồng bộ hóa có thể xem ở một số mức độ trừu tượng khác nhau, ở mức thấp nhất đồng bộ hóa được thực hiện trên các đơn vị dữ liệu của các luồng con. Về nguyên tắc để đảm bảo tuân thủ ràng buộc về nhịp độ, cứ mỗi luồng hình ảnh lại đọc hai luồng âm thanh, điều này được minh họa trên hình vẽ sau.

Ví dụ luồng video cấu chất lượng thấp 320z240 điểm ảnh, mỗi điểm ảnh được mã hóa bằng 1 byte, như vậy đơn vị dữ liệu của ảnh là 76800 byte, đơn vị dữ liệu luồng âm thanh là 11768 byte, cứ sau 33366.7000333667 µs phải đọc hai đơn vị dữ liệu luồng âm thanh, như vậy tiến trình xử lý đầu vào chỉ cần đạt tốc độ 2,5 Mbyte/s thì có thể đạt được sự đồng bộ giữa âm thanh và hình ảnh. Cách tiếp cận này cho thấy ứng dụng hoàn toàn chịu trách nhiệm thực hiện đồng bộ trong nhi nó chỉ có những tiện ích cấp thấp, cách tiếp cận tốt hơn là cung cấp cho ứng dụng một giao diện để có thể dễ dàng kiểm soát các luồng, ví dụ có thể cho phép điều khiển tốc độ hiển thị hình ảnh và âm thanh. Với giao diện điều khiển này có thể viết chương trình gồm hai trình xử lý phục vụ cho mỗi luồng và cùng kiểm tra tính đồng bộ của các luồng, nếu cần thì sẽ điều chỉnh tốc độ của các đơn vị hình ảnh hoặc âm thanh.

 

Giải pháp thực hiện là cài đặt thêm phần mềm trung gian, nó cung cấp các giao diện để điều khiển luồng âm thanh và hình ảnh, bao gồm các giao diện điều khiển thiết  bị vào/ra, mỗi thiết bị có giao diện riêng, bao gồm cả giao diện thông báo lỗi, như vậy phần mềm ứng dụng có thể viết các thủ tục để đồng bộ hóa các luồng dữ liệu. Phân bố cơ chế đồng bộ lại là một vấn đề khác cần xem xét, nhận được luồng dữ liệu phức hợp thì phải biết các đặc tả đồng bộ, thực tế thông tin này được gắn ngầm định khi ghép các luồng con vào đơn vị dữ liệu của luồng phức hợp. Tiêu chuẩn MPEG qui định cách nén hình ảnh và âm thanh, MPEG-2 được thiết kể để phát dữ liệu tốc độ 4 đến 6 Mbit/s, nó có thể hợp nhất các luồng dữ liệu liên tục và  các luồng dữ liệu rời rạc để tạo thành một luồng duy nhất, sau đó được chuyển thành các gói tin được gán nhãn thời gian dựa trên đồng hồ hệ thống tần số 90 KHz. Bên nhận sẽ tách luồng, nhãn thời gian của mỗi gói tin được sử dụng như một cơ chế cơ bản để đồng bộ các luồng. Vấn đề cuối cùng cần bàn đến là quá trình đồng bộ nên đặt ở bên gửi hay bên nhận, nếu bên gửi xử lý thì có thể hợp nhất các luồng con thành luồng duy nhất với loại đơn vị dữ liệu khác. Nếu để bên nhận thực hiện đồng bộ thì các luồng dữ liệu con được lưu chuyển trên mạng sẽ có độ trễ khác nhau, do đó việc đồng bộ sẽ khó khăn hơn,

2.5       Truyền thông theo nhóm

Truyền thông theo nhóm là phương pháp truyền dữ liệu từ một thành viên đến nhiều thành viên khác trong cùng một nhóm. Truyền thông theo nhóm được sử dụng trong rất nhiều lĩnh vực của ứng dụng phân tán như: dịch vụ phát thanh, truyền hình, hội thảo…. Vấn đề chính của giải pháp thưc hiện yêu cầu này nằm ở cách thiết lập kênh truyền thông để phổ biến thông tin, chúng được thiết lập dễ dàng hơn khi có sự trợ giúp của phương pháp truyền thông ngang hàng và đặc biệt là việc quản lý mạng phủ có cấu trúc. Giải pháp  thứ nhất là  truyền thông ngang hàng, nó thường được triển khai tại tầng ứng dụng, bên gửi phải biết thông tin dùng cho việc thiết lập kênh truyền đến tất cả các thành viên nhận. Giải pháp thứ hai dựa trên nguyên lý lan truyền thông tin, nó thường được sử dụng trong các hệ thống qui mô lớn hoặc trường hợp bên gửi không biết đầy đủ thông tin về các thành viên nhận.

2.5.1    Truyền thông theo nhóm mức ứng dụng

Ý tưởng cơ bản là tổ chức các nút thành mạng phủ dùng để phổ biến thông tin cho các thành viên trong nhóm, nó được xây dựng ở tầng ứng dụng cho nên sẽ không có sự tham gia của các thiết bị định tuyến vốn chỉ hoạt động ở tầng mạng. Liên kết giữa các nút trong mạng phủ có thể đi qua nhiều kênh truyền vật lý và do đó việc định tuyến các thông điệp có thể sẽ không tối ưu như cơ chế định tuyến của tầng mạng. Vấn đề quan trọng là thiết kế mạng phủ, cách tiếp cận thứ nhất là tổ chức các nút theo kiến trúc hình cây, như vậy sẽ đảm bảo giữa hai nút bất kỳ sẽ chỉ có một đường đi duy nhất. Cách tiếp cận thứ hai là các nút được tổ chức thành một mạng lưới, mỗi nút sẽ có các nút láng giềng, như vậy tồn tại nhiều đường đi giữa các nút, nếu một đường nào đó bị đứt hoặc quá tải thì có thể tìm đường đi khác mà không cần phải tổ chức lại mạng phủ, như vậy khả năng chịu lỗi sẽ cao hơn.

2.5.1.1     Tổ chức hình cây

Có thể sử dụng giải thuật Chord để xây dựng cây cho một nhóm các thành viên bằng cách tạo mã định danh theo nhóm, giả sử  M_Id là khóa ngẫu nhiên 160 bit, sử dụng hàm succ(M_Id) để tìm kiếm nút chịu trách nhiệm đối với khóa này và đề nghị nút đó là gốc của cây và gửi dữ liệu đến các thành viên của nhóm. Nếu một nút muốn tham gia, nó chỉ cần thực hiện thao tác lookup(M_Id) để gửi thông điệp tìm kiếm đến nút gốc succ(M_Id). Trên đường đến nút gốc, yêu cầu này có thể sẽ phải chuyển tiếp qua một số nút, mỗi nút chuyển tiếp sẽ được ghi nhận là cha của nút gửi yêu cầu. Tuy nhiên, nếu một nút đã là cha của nút gửi thì nó không cần phải chuyển tiếp yêu cầu đến nút gốc nữa vì nó đã được ghi nhận là cha của nút gửi. Việc xây dựng cây không quá khó khi tổ chức các nút thành một mạng phủ, tuy nhiên chưa đề cập đến vấn đề hiệu năng, nó hoàn toàn dựa trên cách định tuyến của mạng phủ.

Giả sử mạng phủ gồm 5 thành viên ABEDC với nút A là gốc, chúng được xây dựng trên nền tảng các thiết bị đinh tuyến với chi phí như trên hình vẽ. Nếu nút A muốn chuyển thông điệp cho các thành viên, đầu tiên sẽ chuyển đến B sau đó đến E, D và cuối cùng chuyển đến C. Dễ dàng nhận thấy sự lãng phí trong cách định tuyến của mạng phủ vì dữ liệu được chuyển hai lần qua các kênh vật lý giữa Ra và Rb, Rc và Rd, chi phí truyền dữ liệu từ B qua E và D đến C là 73, nếu B chuyển trực tiếp qua kênh Rb và Rd đến Rc thì chi phí chỉ còn 47.

Chất lượng của cây truyền thông nhóm thường được đo bằng ba tham số: Ứng suất liên kết, độ trễ tương đối và chi phí cây. Ứng suất liên kết là số lần một gói tin phải chuyển qua cùng một liên kết vật lý, giá trị của nó có thể lớn hơn 1 xuất phát từ thực tế gói tin có thể được vận chuyển trên hai liên kết logic khác nhau nhưng ở mức vật lý gói tin đã bị lặp trên một đoạn liên kết giữa các thiết bị kề cạnh nhau. Độ trễ tương đối đo bằng tỉ số giữa độ trễ giữa hai nút trong mạng phủ với độ trễ trong mạng vật lý, nếu coi chi phí trên hình vẽ là độ trễ thì tỉ lệ này là 1.553191, như vậy mục tiêu cần hướng đến là giảm thiểu độ trễ tương đối trung bình giữa tất cả các cặp nút trong mạng phủ.

Chi phí cây là thước đo chung, nó liên quan đến việc giảm thiểu tổng chi phí liên kết, nếu coi chi phí của một liên kết là độ trễ giữa hai nút cuối thì việc tối ưu hóa chi phí cây sẽ giảm xuống để tìm một cây phủ tổi thiểu trong đó tổng thời gian để lan truyền thông tin đến tất cả các nút là nhỏ nhất. Để đơn giản hóa vấn đề, một nút trong nhóm được giao nhiệm vụ theo dõi các thành viên trong nhóm, một nút mới muốn tham gia sẽ gửi yêu cầu đến nút này để lấy danh sách các thành viên, từ đó sẽ chọn ra thành viên tốt nhất với tư cách là nút cha của nút mới trong cây. Ví dụ xét một nhóm có một nguồn duy nhất, như vậy nút tốt nhất hiển nhiên là nút nguồn vì độ trễ tương đối bằng 1, kết quả là cây phủ có dạng hình sao. Mặc dù đơn giản nhưng dễ dàng nhận thấy nút gốc sẽ trở nên quá tải, việc lựa chọn một nút làm cha nên được hạn chế bởi số lượng các nút con, tuy nhiên điều này lại phức tạp hóa giải thuật thiết lập cây.

Một giải pháp khác nên được đề xuất là xây dựng cây theo cách giao thức STP thực hiện cho các thiết bị chuyển mạch trong mạng máy tính. Ý tưởng của giải thuật khá đơn giản, một nút P có thể chuyển cha bằng cách hủy bỏ liên kết với cha hiện hành và thay thế bằng liên kết đến nút khác với điều kiện cây mẹ không được phép là thành viên bắt nguồn từ nút P và cha của cây mới không có quá nhiều con nhằm tránh hiện tượng quá tải. Có nhiều tiêu chí khác nhau để quyết định chuyển đổi nút cha, cách đơn giản là tối ưu hóa đường đi đến nguồn, giảm thiểu độ trễ khi thông điệp được truyền theo nhóm. Để thực hiện điều này thì mỗi nút phải thường xuyên nhận được thông tin về trạng thái của các nút khác, mỗi nút sẽ tự đánh giá, nếu tuyến mới tốt hơn thì chuyển đổi cha. Một tiêu chí khác là lấy độ trễ đến nút cha làm thước đo để so sánh, nếu tất cả các nút đều làm như vậy thì độ trễ tổng thể của cây trong trường hợp lý tưởng sẽ là nhỏ nhất. Cụ thể, mỗi nút sẽ lấy tập các nút láng giềng của cha, nghĩa là nút ông và các nút con khác của cha sau đó tính toán độ trễ của từng nút và chọn nút có độ trễ thấp nhất, khi đang thực hiện tìm cha thì sẽ từ chối các yêu cầu gửi đến để tránh hiện tượng lặp. Vấn đề cuối cùng cần phải giải quyết là lỗi của một nút cha, khi đó nó sẽ tạm thời chọn nút gốc làm cha và khởi động lại giải thuật tối ưu hóa để gán các nút con của nút bị lỗi vào nút cha thích hợp.

2.5.1.2     Quảng bá trong nhóm

Vấn đề quan trọng trong truyền thông theo nhóm là giảm thiểu các nút trung gian mà thông điệp không được sử dụng, nút không sử dụng thông điệp gọi là nút chuyển tiếp, như vậy mạng phủ được xây dựng như một cây đa cấp thì chỉ có nút lá là những thành viên sử dụng thông điệp. Để tránh sự lãng phí đó thì cần xây dựng mạng phủ cho mỗi nhóm, nhưng một thành viên có thể thuộc về nhiều nhóm, như vậy mỗi nút sẽ phải duy trì danh sách các thành viên của từng nhóm.

Giả sử mạng phủ tương ứng với một nhóm, khi đó việc truyền thông điệp theo nhóm sẽ trở thành quảng bá thông điệp trong nhóm. Khi nhận được thông điệp mỗi nút chỉ cần kiểm tra xem đó có phải là thông điệp mới hay không, nếu là thông điệp cũ thì bỏ qua, nếu là thông điệp mới chuyển tiếp đến các nút láng giềng ngoại trừ nút gửi thông điệp cho nó. Như vậy số lượng thông điệp sẽ tăng gấp đôi, nghĩa là hiệu quả sẽ thấp hơn, có thể hình dung mạng phủ như một đồ thì N nút với M cạnh, nếu tổ chức hình cây thì trường hợp tối ưu nhất M=N-1, trường hợp xấu nhất tất cả các nút được nối với nhau thì M=N(N-1)/2. Giả sử không có thông tin gì về cấu trúc mạng phủ, như vậy có thể xây dựng đồ thị ngẫu nhiên, ký hiệu pedge xác xuất hai nút bất kỳ được nối với nhau, đồ thị khi đó sẽ có M= pedge N(N-1)/2 cạnh, mối quan hệ giữa chúng được minh họa trên hình vẽ.

Có thể giảm số lượng thông điệp bằng cách sử dụng phương pháp xác xuất Banaei-Kashani và Shahab, mỗi nút sẽ sử dụng xác xuất pflood để chọn pfloodN nút  để chuyển tiếp, trong đó N là số lượng nút láng giềng. Như vậy số lượng thông điệp sẽ giảm đi nhưng lại nảy rủi ro không phải tất cả các nút đều nhận được thông điệp, vì vậy cần phải thêm yếu tố số lượng nút láng giềng trong quyết định chuyển tiếp. Schlosser đã thiết kế một lược đồ quảng bá hiệu quả dựa vào việc theo dõi các nút láng giềng trên mỗi chiều, định danh mỗi nút được thể hiện bảng chuỗi bit với chiều dài bằng số chiều của nhóm, mỗi cạnh trong mạng phủ được gán nhãn với kích thước của nó thể hiện bit đã thay đổi khi so sánh chuỗi bit định danh của hai nút. Tập láng giềng được xác định bằng cách thay đổi lần lượt từng bit của định danh nút đó, ví dụ xét trường hợp số chiều N=4 nút 0000 sẽ có tập láng giềng là {0001, 0010, 0100, 1000}, nút 0001 có tập láng giềng là {0000, 0011, 0101, 1001}..., cạnh giữa 0000 và 1000 được gán nhãn 4 tương ứng với việc thay đổi bit thứ tư, cạnh giữa 0000 và 0100 được gán nhãn bằng 3 tương đương với việc bit thứ ba bị thay đổi. Nút ban đầu quảng bá thông điệp m đến tất cả các nút láng giềng và đính kèm nhãn của cạch đã gửi thông điệp, ví dụ nút 1001 có tập láng giềng là {1000, 1011, 1101, 0001}, khi đó nó quảng bá các thông điệp như sau:

·        (m,1) đến 1000

·        (m,2) đến 1011

·        (m,3) đến 1101

·        (m,4) đến 0001

Khi một nút nhận được thông điệp quảng bá, nó chỉ chuyển tiếp đến các nút láng giềng trên cạnh được gán giá trị cao hơn, ví dụ nút 1101 có tập láng giềng là {1100, 1111, 1001, 0101}, nhãn của thông điệp gửi đến là 3 do đó nó sẽ chỉ chuyển tiếp thông điệp này cho nút  0101. Sử dụng lược đồ này cho thấy cần quảng bá 2N-1 thông điệp, dưới góc độ số lượng thông điệp lưu chuyển trong mạng thì đây là cách tối ưu.

2.5.2    Lan truyền ngẫu nhiên

Phương pháp lan truyền ngẫu nhiên dựa trên nguyên lý lan truyền bệnh dịch, không cần thành phần điều phối mà chỉ cần sử dụng thông tin cục bộ vẫn truyền thông nhanh chóng trong tập hợp lớn các nút. Khi cập nhật xảy ra tại một nút, giải thuật lan truyền được thực hiện sao cho thông tin đến được tất cả các nút khác một cách nhanh nhất có thể. Như vậy mỗi nút có thể nhận được thông điệp từ nhiều nút khác, để phân biệt dữ liệu cũ với dữ liệu mới, nhãn thời gian sẽ được đính kèm vào mỗi thông điệp lan truyền. Thông điệp ở đây được hiểu là các yêu cầu, tuy nhiên nó có thể là dữ liệu để bổ sung vào kho lưu trữ của mỗi nút, nhưng nó cũng có thể là yêu cầu xóa một mục dữ liệu nào đó trên mỗi nút. Một nút được gọi là đã cập nhật nếu nó nắm giữ dữ liệu muốn phổ biến cho các nút khác, nút chưa nhận được thông điệp gọi là nút chưa cập nhật, một nút không sẵn sàng hoặc không thể phát tán dữ liệu của mình bị coi là nút không tham gia. 

Mô hình lan truyền thường dùng là mô hình chống thất thoát (anti-entropy), giả sử nút P chọn ngẫu nhiên nút Q để trao đổi bản tin cập nhật, có ba cách tiếp cận:

1.      P chỉ đẩy các bản tin cập nhật của mình lên Q

2.      P chỉ lấy các bản tin cập nhật mới từ Q

3.      P và Q gửi các bản tin cập nhật cho nhau

Nếu lan truyền cập nhật xảy ra nhanh chóng thì cách tiếp cận thứ nhất không phải là lựa chọn tốt,  nhiều nút được đánh dấu là đã cập nhật, do đó xác xuất để tìm ra nút chưa cập nhật rất thấp, vì vậy nút chờ cập nhật có thể phải chờ thời gian khá lâu vì không được nút nào chọn. Trong trường hợp này cách tiếp cận thứ hai sẽ tốt hơn, một nút chưa cập nhật chọn ngẫu nhiên nút khác, nếu đó là nút đã cập nhật thì sẽ kéo dữ liệu về, xác suất chọn được nút đã cập nhật sẽ cao hơn. Nếu chỉ có duy nhất một nút được cập nhật thì có thể sử dụng cả hai cách tiếp cận, tuy nhiên cách tiếp cận thứ ba vẫn là lựa chọn tốt nhất. Chu kỳ mỗi nút thực hiện một lần trao đổi cập nhật với nút khác được chọn ngẫu nhiên gọi là vòng, số vòng để lan truyền một cập nhật đến tất cả các nút là O (log (N)), trong đó N là số lượng các nút trong nhóm, điều đó cho thấy phương pháp lan truyền khá nhanh chóng, nhưng quan trọng hơn cả là khả năng mở rộng qui mô. Giả sử nhóm gồm N nút, một nút bất kỳ bắt đầu lan truyền thông điệp đến các nút khác, gọi pi là xác suất nút P chưa nhận được thông điệp sau vòng thứ i, như vậy có ba trường hợp:

·        Cách tiếp cận đẩy: Sau vòng thứ i có N(1-pi) nút đã nhận được bản tin, ở  vòng thứ i+1 xác xuất số nút liên hệ với P là 1-1/(N-1), như vậy xác suất P không nhận được bản tin là  pi+1 = pi(1-1/(N-1))N(1-pi).

·        Cách tiếp cận kéo: Nút P liên hệ với nút khác nhưng nút đó cũng chưa nhận được bản tin, do đó xác suất P không nhận được bản tin là pi+1 = (pi)2.

·        Cách tiếp cận đẩy và kéo: P liên hệ với nút chưa nhận được bản tin và cũng không có nút nào liên lạc với P, xác xuất pi+1 = (pi)2pi(1-1/(N-1))N(1-pi).

Giả sử nhóm gồm có 10000 nút, thể hiện bằng đồ thị cho thấy kể từ vòng thứ tám xác xuất các nút chưa nhận được bản tin giảm nhanh đáng kể, chỉ cần đến vòng thứ 15 thì xác suất đó xấp xỉ bằng 0, điều đó minh chứng mô hình lan truyền ngẫu nhiên rất hiệu quả trong các hệ thống qui mô lớn. Một biến thể khác của giao thức lan truyền ngẫu nhiên gọi là lan truyền tin đồn, nếu nút P gửi thông điệp cho nút Q, nếu Q đã nhận được thông điệp này từ các nút khác thì nó sẽ thông báo cho nút P sẽ không tiếp tục cập nhật cho các nút khác, gọi xác xuất đó là pstop. Như vậy số lượng thông điệp lan truyền sẽ giảm đi, tuy nhiên cách làm này không đảm bảo tất cả các nút đều nhận được thông điệp, ký hiệu s là xác suất các nút chưa được cập nhật, u là xác suất các nút đã nhận được thông điệp và vẫn đang liên hệ với các nút khác để lan truyền thông tin, r là xác suất các nút đã được cập nhật nhưng từ bỏ lan truyền, rõ ràng s+u+r=1.  Sử dụng lý thuyết xác suất thống kê cho thấy quan hệ giữa s và pstop thỏa mãn phương trình:

s=e-(1/pstop+1)(1-s)

Đồ thị biểu diễn tương quan giữa s và pstop cho thấy, khi pstop có giá trị xấp xỉ 0.2 thì s=0.0025, với những giá trị lớn hơn 0.2 thì giá trị s sẽ tăng nhanh và do đó cần các biện pháp bổ sung để đảm bảo tất cả các nút đều nhận được bản tin. Ưu điểm chính của phương pháp lan truyền ngẫu nhiên là khả năng hội tụ nhanh, số lượng thao tác đồng bộ tương đối nhỏ so với các phương pháp khác. Đối với các hệ thống được kết nối qua mạng diện rộng thì cần phải xem xét cấu trúc liên kết mạng để có thể đạt kết quả tốt hơn, các nút sẽ chỉ liên hệ với vài nút khác với xác suất tương đối cao, nên ưu tiên cập nhật cho các nút cầu nối giữa các mạng, giải pháp này gọi là lan truyền có định hướng.

 

Vấn đề cuối cùng là lan truyền thông điệp chứa yêu cầu xóa mục dữ liệu nào đó, đây là công việc không hề đơn giản, bản chất của nó nằm ở chỗ thông điệp đã bị xóa sẽ lại được các nút khác cập nhật lại. Khi đã xóa một thông điệp ra khỏi kho lưu trữ, nó nhận được thông điệp từ các nút khác, kiểm tra trong kho dữ liệu không thấy thông điệp đã bị xóa, nó coi đó là thông điệp mới, do đó sẽ ghi vào kho lưu trữ và lại tiếp tục quá trình lan truyền cho các nút khác. Một giải pháp đơn giản là lưu lịch sử thao tác xóa, như vậy thông điệp yêu cầu xóa sẽ trở thành thông điệp cập nhật, khi nhận được thông điệp cập nhật từ các nút khác, trước hết nó phải kiểm tra nhật ký để quyết định có cập nhật hay không.

Cùng với thời gian, kho dữ liệu lịch sử thao tác xóa có thể rất lớn, điều này làm ảnh hưởng tới hiệu năng hệ thống, do đó cần phải tính toán thời gian hội tụ của các bản tin lan truyền, sau khoảng thời gian này có thể loại bỏ những bản ghi lịch sử không còn giá trị sử dụng. Để đảm bảo chắc chắn thông điệp yêu cầu xóa được chuyển đến tất cả các nút, hệ thống nên chọn một số nút không bao giờ xóa dữ liệu lịch sử xóa. Giả sử nút P đã xóa mục dữ liệu x, sau khoảng thời gian qui định cho phép xóa dữ liệu lịch sử nó ngẫu nhiên nhận được thông điệp cập nhật cho mục dữ liệu x, khi đó P sẽ lan truyền thông điệp xóa mục dữ liệu x đến các nút khác.

 

 

 

 


CHƯƠNG 3:                   ĐẶT TÊN TRONG HỆ THỐNG PHÂN TÁN

Tên của thực thể đóng vai trò quan trọng trong tất cả các hệ thống máy tính, chúng dùng để chia sẻ tài nguyên, xác định duy nhất các thực thể, tham chiếu đến vị trí…. Tìm kiếm là một trong những nhiệm vụ quan trọng của các hệ thống thông tin, hiệu năng tìm kiếm phụ thuộc rất nhiều vào cách thức đặt tên và tổ chức dữ liệu tìm kiếm. Trong hệ thống phân tán, hệ thống đặt tên thường được cài đặt trên nhiều máy tính, qui tắc đặt tên không những phải đảm bảo tính duy nhất mà còn đáp ứng yêu cầu về hiệu năng và qui mô, tạo điều kiện để tìm kiếm các đối tượng một cách tốt nhất. Hệ thống đặt tên thường dùng hiện nay gồm ba loại: đặt tên phi cấu trúc, đặt tên có cấu trúc và đặt tên dựa trên thuộc tính. Với mỗi cách đặt tên cần có các giải thuật tìm kiếm sao cho có thể xác định chính xác các thực thể một cách chính xác và hiệu quả nhất.

3.1       Tên, định danh và địa chỉ

Tên là một xâu các bit hoặc các ký tự dùng để tham chiếu đến một thực thể, đó có thể là máy tính, ổ đĩa hay các tập tin, số lượng tên cho mỗi thực thể không bị hạn chế. Tên thân thiện là các tên được đặt một cách dễ hiểu và thân thuộc với con người, thông thường tên thân thiện gợi nhớ cho con người một số đặc điểm của thực thể. Không gian tên dùng để biểu diễn tất cả các tên, xét về mặt hình học thì đây là một đồ thị có hướng, gồm các nút và các cung, gọi là đồ thị tên. Đồ thị tên có cấu trúc là đồ thị mà mỗi nút lá miêu tả một một thực thể, mỗi nút thư mục gắn với nhiều nút khác và được lưu trữ trong bảng thư mục gồm tập các cặp nhãn và định danh của thực thể. Định danh là một loại tên đặc biệt, mỗi thực thể chỉ được tham chiếu bởi duy nhất một định danh và mỗi định danh tham chiếu duy nhất đến một thực thể, nó cần phải đáp ứng ba yêu cầu sau:

-         Định danh chỉ tham chiếu đến duy nhất một thực thể

-         Mỗi thực thể chỉ có một định danh

-         Không được tái sử dụng định danh.

Địa chỉ là điểm truy nhập đến thực thể, các điểm truy nhập này cũng phải được đặt tên và tên đó chính là địa chỉ của thực thể. Để truy nhập đến một thực thể cần phải biết điểm truy nhập hay còn gọi là địa chỉ của thực thể đó. Địa chỉ là một loại tên đặc biệt:

-         Một tên có thể gồm nhiều địa chỉ

-         Thực thể có thể thay đổi địa chỉ trong quá trình tồn tại

-         Một địa chỉ có thể trỏ đến các thực thể khác nhau trong các thời điểm khác nhau

-         Đảm bảo có thể tham chiếu tới các tài nguyên bằng tên

Với việc sử dụng định danh sẽ tránh được những tình huống nhập nhằng trong việc truy nhập thực thể. Trong hệ thống phân tán, việc truy nhập đến một thực thể thường phải tham chiếu đến nhiều tên.

3.2       Đặt tên và các giải pháp tìm kiếm

3.2.1       Đặt tên phi cấu trúc

Đặt tên phi cấu trúc còn gọi là tên phẳng, đơn thuần chỉ gồm chuỗi các bit ngẫu nhiên không chứa bất kỳ thông tin nào liên quan tới thực thể. Để xác định điểm truy nhập tới các thực thể, người ta sử dụng bốn giải pháp: Giải pháp đơn giản, dựa trên nguồn gốc, hàm băm phân tán và giải pháp phân cấp.

3.2.1.1     Các giải pháp tìm kiếm đơn giản

Giải pháp đơn giản có thể thực hiện bằng cách gửi định danh cần tìm theo phương pháp quảng bá, gửi cho các thành viên trong nhóm, sử dụng con trỏ chuyển tiếp. Phương pháp truyền thông quảng bá hoặc truyền thông theo nhóm được thực hiện bằng cách gửi định danh cần tìm tới tất cả các thành viên, thành viên nào có thực thể trùng khớp với định danh cần tìm thì gửi lại một thông điệp chứa địa chỉ của điểm truy nhập. Hai phương pháp đầu tiên đòi hỏi tất cả các thành viên đều phải lắng nghe và tiếp nhận yêu cầu gửi đến, nó chỉ phù hợp với qui mô nhỏ, do đó thường chỉ được áp dụng trong các mạng cục bộ. Phương pháp dùng con trỏ chuyển tiếp dựa trên nguyên tắc một thực thể khi rời sang vị trí khác thì phải để lại thông tin tham chiếu tới vị trí mới. Khi cần tìm một thực thể, máy khách có thể xác định ngay được địa chỉ hiện tại của thực thể này bằng cách dò tìm lưu vết qua các thành viên chuyển tiếp, tuy nhiên nếu chuỗi các con trỏ quá dài sẽ dẫn đến hiệu năng thấp và nguy cơ đứt đường truyền liên kết.

Nếu các máy tính được kết nối trong mạng cục bộ thì việc tìm kiếm một đối tượng bằng phương pháp quảng bá rất đơn giản, định danh của thực thể cần tìm sẽ được gắn vào thông điệp gửi quảng bá đến tất cả các máy, máy nào đáp ứng yêu cầu thì phản hồi. Nguyên lý này là cơ sở để xây dựng giao thức ARP dùng để tìm kiếm địa chỉ vật lý khi biết địa chỉ IP, nó tạo khung dữ liệu với địa chỉ vật lý đích là địa chỉ quảng bá FFFFFFFFFFFF, khung dữ liệu sẽ được chuyển đến tất cả các máy trong mạng, chỉ máy nào có địa chỉ trùng khớp với địa chỉ IP cần tìm thì mới phản hồi. Nếu qui mô mạng lớn hơn thì giải pháp quảng bá sẽ kém hiệu quả, nó không những lãng phí băng thông mà còn làm gián đoạn công việc của các máy khác. Để khắc phục nhược điểm này có thể hạn chế một số máy nhận được yêu cầu bằng cách sử dụng giải pháp truyền thông theo nhóm, tiêu chuẩn Ethernet 802.3 qui định bit thấp nhất của byte cao nhất bằng 1 thì đó là địa chỉ vật lý truyền thông theo nhóm. Truyền thông theo nhóm cũng có thể được sử dụng để xác định các thực thể trong mạng điểm-điểm, tầng mạng dành riêng địa chỉ IP lớp D dùng để truyền theo nhóm.

Phương pháp con trỏ chuyển tiếp thường dùng cho các thực thể di động, khi thực thể di chuyển, nó để lại vị trí cũ một tham chiếu đến vị trí mới, như vậy chỉ cần lần theo chuỗi các con trỏ chuyển tiếp sẽ tìm thấy thực thể. Nếu một thực thể hay di chuyển thì chuỗi con trỏ sẽ rất lớn, điều đó dẫn đến hậu quả tăng chi phí tìm kiếm. Các nút trung gian sẽ phải duy trì con trỏ chuyển tiếp, nếu con trỏ chuyển tiếp bị lỗi trên một nút nào đó thì sẽ không thể tìm thấy thực thể. Ví dụ xem xét trường hợp con trỏ chuyển tiếp trong gọi thủ tục từ xa, mỗi thủ tục từ xa sinh ra một cặp Stub dành cho máy khách và Skeleton dành cho máy chủ.  Giả sử đối tượng di chuyển từ máy A sang máy B, khi tiến trình P1 trên máy khách gọi thủ tục tìm kiếm đối tượng, nó sẽ gửi yêu cầu đến tiến trình P3 cài đặt trên máy A. Nếu đối tượng vẫn nằm trên máy A thì tiến trình P3 chỉ cần gọi cục bộ và trả về kết quả cho máy khách, nhưng vì đối tượng đã chuyển sang máy B, tiến trình P3 sẽ gửi yêu cầu sang tiến trình P4 trên máy B, sau khi nhận được kết quả từ P4, tiến trình P3 sẽ trả về kết quả cho tiến trình P1. Giải pháp con trỏ chuyển tiếp che giấu toàn bộ quá trình tìm kiếm đối tượng, máy khách chỉ biết đến máy chủ đầu tiên mà không biết đến các máy khác trong chuỗi con trỏ chuyển tiếp, quá trình tìm kiếm trên máy chủ hoàn toàn trong suốt đối với máy khách, tính bảo mật không những sẽ tốt hơn mà còn có thể tiết kiệm địa chỉ IP công cộng bằng cách gán cho các máy chủ địa chỉ IP riêng.

 

 

Để giảm chuỗi con trỏ chuyển tiếp, tiến trình P3 gắn kèm định danh của máy khách khi gọi thủ tục trên tiến trình P4, tiến trình P4 sẽ trả trực tiếp kết quả về cho máy khách mà không cần phải qua tiến trình P3, định danh ở đây thông thường là cặp địa chỉ IP và số hiệu cổng máy khách đã gửi. Nhận được kết quả, máy khách sẽ cập nhật cấu hình của mình để lần sau khi cần tìm đối tượng sẽ gọi trực tiếp đến tiến trình P4, như vậy hiệu năng sẽ tăng lên nhưng không còn duy trì được tính trong suốt, không che giấu được địa chỉ của máy B và cũng không tiết kiệm được địa chỉ IP công cộng.

 

Khi tất cả các máy khách đã được cập nhật vị trí mới của đối tượng, máy chủ A có thể loại bỏ bản ghi con trỏ chuyển tiếp liên quan đến đối tượng, điều này về lý thuyết thì đơn giản nhưng thực tế sẽ phức tạp hơn nhiều. Sự cố phát sinh nếu một trong những máy chủ của chuỗi con trỏ chuyển tiếp gặp lỗi, có thể giải quyết vấn đề này bằng cách bố trí máy chủ luôn lưu giữ thông tin tham chiếu đến vị trí hiện hành của đối tượng, nó được cài đặt theo cơ chế dự phòng, chỉ khi nào xảy ra lỗi trong chuỗi con trỏ chuyển tiếp thì mới tham chiếu đến máy chủ này.

3.2.1.2     Tìm kiếm dựa trên nguồn gốc

Cách tiếp cận dựa trên nguồn gốc hỗ trợ các thực thể di động trong các hệ thống qui mô lớn, vị trí của thực thể được đăng kí với một máy chủ gọi là nguồn gốc, thực thể luôn phải cập nhật vị trí hiện hành khi di chuyển.  Cách tiếp cận này được sử dụng như một cơ chế dự phòng khi một mắt xích trong chuyển tiếp con trỏ gặp lỗi. Ví dụ vê mạng IP di động, mỗi thực thể di động được máy chủ gốc cấp phát một địa chỉ IP cố định, mọi liên lạc với địa chỉ IP này trước tiên sẽ được chuyển đến tiến trình đại diện mạng gốc. Nếu thiết bị di động chuyển sang mạng khác, nó yêu cầu mạng mới cấp địa chỉ IP tạm thời để liên lạc, giá trị này sẽ được chuyển đến tiến trình đại diện mạng gốc để cập nhật cơ sở dữ liệu. Khi tiến trình nhận được gói tin dành cho thực thể di động, nó tra cứu cơ sở dữ liệu để tìm ra địa chỉ hiện hành của thực thể di động, nếu cùng mạng thì chỉ cần chuyển tiếp gói tin, ngược lại nó sẽ trả về cho bên gửi một gói tin thông báo địa chỉ hiện hành của thực thể di động và đồng thời tạo đường hầm chuyển tiếp gói tin nhận đến tiến trình đại diện cho mạng mới, từ đó gói tin sẽ được chuyển tiếp đến thực thể di động. Thực thể di động sẽ trả lời bằng cách chuyển gói tin đến tiến trình đại diện của mạng mới, gói tin sẽ được chuyển tiếp đến bên yêu cầu, những gói tin kế tiếp sẽ được bên gửi chuyển trực tiếp đến tiến trình đại diện mạng mới mà không cần phải qua tiến trình đại diện của mạng gốc.

 

Cơ chế chuyển đổi trên hoàn toàn trong suốt đối với tiến trình xử lý tầng ứng dụng, bên gửi sẽ ghi nhớ địa chỉ mới của thiết bị di động để sử dụng cho việc gửi các gói tin kế tiếp, thiết bị di động nhận được gói tin bằng cách giải mã bản tin nhận được từ đường hầm như thể nó đang sử dụng địa chỉ gốc. Phải tham chiếu đến máy chủ gốc là nhược điểm của phương pháp này, nó không những làm tăng độ trễ truyền thông mà còn không thể thực hiện được khi máy chủ gốc bị lỗi, nếu một thực thể quyết định di chuyển tới mạng mới vĩnh viễn thì cũng nên đăng ký lại địa chỉ gốc.  Giải pháp cho vấn đề này là sử dụng dịch vụ đặt tên truyền thống, máy khách chỉ cần tra cứu vị trí của máy chủ gốc, thông số này tương đối ổn định cho nên nó có thể được lưu vào bộ nhớ cache để sử dụng cho những lần tìm kiếm kế tiếp.

3.2.1.3     Bảng băm phân tán

Nhiều hệ thống tìm kiếm dựa trên hàm băm phân tán đã được phát triển, tiêu biểu là giải thuật Chord, nó sử dụng không gian định danh m-bit để gán định danh được lựa chọn ngẫu nhiên cho các nút và các khóa cho mỗi thực thể, của m có thể bằng 128 hoặc 160 tùy thuộc vào hàm băm được sử dụng, ví dụ giải thuật SHA1 sử dụng 160 bit. Một thực thể có khóa k sẽ thuộc quản lý của nút liền sau với định danh nhỏ nhất sao cho id ≥ k và được ký hiệu là succ(k), để đơn giản chúng ta tạm gọi định danh p là nút P. Vấn đề chính cần giải quyết là phân giải một cách hiệu quả khóa k thành địa chỉ của nút liền sau, đơn giản nhất là giải pháp tuyến tính, mỗi nút P sẽ ghi nhớ nút liền trước và liền sau của nó, khi nhận được yêu cầu nó chỉ cần chuyển tiếp cho một trong hai nút này, nếu pred (p) < k ≤ p thì nút P sẽ trả về địa chỉ qua mình cho tiến trình khởi tạo yêu cầu phân giải.

Thay cho cách tiếp cận tuyến tính, giải thuật Chord duy trì một bảng định tuyến chứa s ≤ m thực thể, nếu FTp biểu thị tuyến của nút P thì FTp [i]=succ (p+2­­i-1), nghĩa là mục thứ i trỏ đến nút đầu tiên kế tiếp p ít nhất 2­­i-1, khoảng cách giữa các nút tăng lên theo cấp số nhân. Để tra cứu khóa k, nút P tìm kiếm trên bảng định tuyến, giả sử bản ghi thứ j cho biết phải chuyển tiếp đến nút Q, trong đó  q=FTp [j] ≤ k < FTp [j+1] hoặc q = FTp [1] khi  p < k < FTp [1], nếu bảng định tuyến của mỗi nút chỉ có một bản ghi thì giải thuật trở thành tìm kiếm tuyến tính.

Xét qui trình phân giải k=26 khởi nguồn từ nút 1, bảng định tuyến trên nút này cho thấy FT1 [5] thỏa mãn điều kiện, như vậy nó sẽ chuyển yêu cầu đến nút 18. Tại nút 18 ta thấy FT18 [2] ≤  k < FT18 [3] nên nó sẽ chọn nút 20, tương tự như vậy nút 20 chọn bản gi đầu tiên nên chuyển cho nút 21, nút 21 chuyển cho nút 28 chịu trách nhiệm cho khóa k=26, nó trả về cho nút 1 địa chỉ cần tìm. Nếu yêu cầu phân giải k =12 xuất phát từ nút 28, bản ghi thứ tư cho thấy cần phải chuyển sang nút số 4, tại đây bản ghi thứ ba thấy rằng cần phải chuyển sang nút số 9, nó lại chuyển tiếp cho nút số 11 và sau đó đến nút 14 chịu trách nhiệm cho k=12 nên trả về địa chỉ cho nút 28. Có thể thấy quá trình phân giải sẽ thực hiện trên O (log (N)) bước, với N là số nút trong hệ thống.

Số lượng các nút trong hệ thống có thể thay đổi, chúng có thể rời đi hoặc tham gia một cách tự nguyện nhưng cũng có thể do gặp lỗi nó phải rời đi, khắc phục xong lỗi lại tiếp tục tham gia. Trong giải thuật Chord, nếu một nút P muốn tham gia thì chỉ cần liên hệ với một nút bất kỳ và gửi thông điệp tìm kiếm nút liền sau succ(p+1), nhận được kết quả sẽ tự chèn vào vòng logic của hệ thống. Quan trọng nhất là phải duy trì chính xác bản ghi đầu tiên, mỗi nút bất kỳ Q thường xuyên chạy một thủ tục để liên hệ với succ(q+1) và yêu cầu trả về liền trước của nút đó, nếu  q=pred (succ (q + 1)) thì không cần phải cập nhật bảng định tuyến, ngược lại thì có thể hiểu một nút P đã được thêm vào hệ thống, với q < p  ≤ succ(q+1) thì Q sẽ điều chỉnh FTq [1] thành p. Sau đó nó thực hiện kiểm tra để đảm bảo chắc chắn P nhận Q là nút liền trước, nếu không đúng thì phải điều chỉnh lại FTq [1]. Quá trình tương tự sẽ được thực hiện trên các bản ghi khác k = q +2i-1, những yêu cầu này sẽ được thường xuyên gửi đi bằng các phương tiện nền của hệ thống.

Các nút trong hệ thống luôn theo dõi các nút liền trước của chúng, nếu không liên lạc được với nút liền trước, nó chỉ cần đánh dấu trạng thái không xác định. Nếu một nút Q liên hệ với nút liền sau succ(q+1), nhưng nút liền sau lại đã đặt Q không xác định thì nó thông báo cho succ(q+1) để ghi nhận Q là nút liền trước. Khi một nút rời khỏi mạng, tất các khóa được chuyển cho nút kế tiếp, sau đó thông báo cho nút kế tiếp và và nút liền trước. Bảng định tuyến trên các nút khác sẽ dần dần được điều chỉnh thông qua quá trình ổn định mạng định kỳ. Nếu một nút đột ngột rời khỏi mạng sẽ gây ra các hậu quả như sau:

-         Có thể gây mất các khóa, các mục liên quan đến khóa.

-         Một số nút sẽ không truy vấn được một số khóa nhất định.

Chord giải quyết vấn đề này bằng cách lưu trên mỗi nút một danh sách các nút nằm sau nó trong vòng Chord, nếu một nút đột ngột không liên lạc được với nút kế tiếp thì nó sẽ sử dụng các nút liền sau trong danh sách. Tiếp nữa các khóa và các mục liên quan tới khóa sẽ được sao chép trên các nút có trong danh sách, do đó một khóa và các mục liên quan đến khóa sẽ chỉ bị mất khi có log2(N)+1 các nút trong danh sách cùng rời khỏi mạng.

3.2.1.4     Cách tiếp cận phân cấp

Cách tiếp cận phân cấp dựa trên dịch vụ địa cầu, mạng được chia thành nhiều miền, trong đó có một miền cấp cao nhất bao trùm toàn bộ mạng, mỗi miền lại có thể được chia thành nhiều miền con, miền thấp nhất gọi là lá, nó tương ứng với mạng cục bộ hoặc tế bào trong mạng điện thoại di động. Nói chung, thời gian chuyển thông điệp giữa các nút trong miền nhỏ sẽ ít hơn trong các miền lớn. Mỗi miền có một nút thư mục liên kết theo dõi các thực thể trong miền, điều đó dẫn đếm một cây thư mục, nút thư mục của miền cấp cao nhất gọi là nút thư mục gốc, nó biết tất cả các thực thể.

Chỉ có nút lá mới lưu trữ địa chỉ hiện tại của thực thể, các nút thư mục lưu trữ con trỏ đến nút cấp thấp hơn. Một thực thể có thể có nhiều địa chỉ, chúng được lưu trữ trên các miền là khác nhau, do đó nút thư mục cấp trên sẽ phải lưu trữ nhiều con trỏ, mỗi con trỏ cho một miền lá.

Khi máy khách gửi yêu cầu đến nút thư mục của miền lá để lấy địa chỉ của một thực thế, nếu nút thư mục không tìm thấy thì sẽ chuyển lên nút cha của nó, nếu nút cha cũng không tìm thấy thì sẽ chuyển lên nút thư mục cấp cao hơn. Ví dụ trên hình vẽ, khi yêu cầu được gửi đến miền D nhưng không tìm thấy thực thể nên chuyển đến các nút cấp cao hơn,  nút thư mục M lưu bản ghi vị trí cho thực thể, như vậy chỉ cần tìm kiếm trong miền do nút M phụ trách. Yêu cầu tìm kiếm được chuyển đến nút con của M, cứ như vậy cho đến khi tìm thấy nút lá chứa địa chỉ của thực thể, địa chỉ đó sẽ được chuyển về cho máy khách.

Cách tiếp cận phân cấp ưu tiên tìm kiếm cục bộ, khu vực tìm kiếm được mở rộng mỗi khi yêu cầu phân giải được chuyển lên cấp cao hơn, trường hợp xấu nhất xảy ra khi yêu cầu đó được chuyển đến nút gốc. Vì nút gốc chứa bản ghi cho mỗi thực thể, do đó nó chỉ cần chuyển tiếp dọc theo các nút con để đến nút lá, ở đó sẽ tìm thấy địa chỉ của thực thể và trả về cho máy khách. Thao tác cập nhật cũng được thực hiện tương tự, một thực thể muốn chèn địa chỉ vào một nút lá, ngay lập tức nút lá sẽ chuyển tiếp yêu cầu lên nút cha, nếu địa chỉ của thực thể đã tồn tại trong miền quản lý thì sẽ dừng chuyển tiếp đến nút cấp cao hơn. Nút cha sẽ lưu bản ghi vị trí của thực thể và quá trình cập nhật bản ghi lại được thực hiện theo chiều đi xuống, mỗi nút sẽ lưu con trỏ đến nút cấp thấp hơn, cuối cùng nút lá sẽ cập nhật địa chỉ của thực thể đã yêu cầu.

Thêm địa chỉ theo cách trên dẫn tới việc cài đặt chuỗi con trỏ theo kiểu từ trên xuống dưới, bắt đầu từ nút thư mục cấp thấp nhất có chứa bản ghi vị trí của thực thể, nếu yêu cầu gửi lên nút cha không thực hiện được thì thao tác cập nhật thất bại. Cũng có thể thực hiện theo cách từ dưới lên trên, nghĩa là nút lá tạo bản ghi địa chỉ trước khi chuyển yêu cầu đến nút cha, nếu chưa thể  cập nhật nút cha thì vẫn có thể tìm kiếm cục bộ tài miền của nút lá hiện hành. Thao tác xóa cũng tương tự như cách thêm, khi cần xóa địa chỉ cho một thực thể tại nút lá, nếu bản ghi không chứa các địa chỉ khác của thực thể thì nó có thể xóa, sau đó chuyển yêu cầu đến nút thư mục cấp cao hơn, nếu bản ghi vị trí của thực thể tại các nút cấp cao hơn rống thì có thể xóa bản ghi tại nút đó, quá trình tiếp diễn cho đến nút gốc.

Cách tiếp cận phân cấp liệu có thể đáp ứng yêu cầu về qui mô hay không, khi mà nút gốc cũng cần phải theo dõi tất cả các định danh, dường như đây là một lỗ hổng trong thiết kế. Giả sử mỗi thực thể được gán định danh trong không gian m-bit, hệ thống gồm N máy chủ cung cấp dịch vụ tìm kiếm, mỗi máy chủ có khả năng chạy một hoặc nhiều dịch vụ xác định vị trí, mỗi dịch vụ đại diện cho một nút ở các cấp độ khác nhau của cây. Ký hiệu Dk(A) là miền cấp k chứa địa chỉ A, với k = 0 biểu thị miền gốc, LSk (E, A) là dịch vụ xác định vị trí duy nhất trong Dk(A) chịu trách nhiệm theo dõi vị trí hiện tại của thực thể E. Tập Dk = {Dk, 1, Dk, 2 ,. . . , Dk, Nk} biểu thị Nk miền ở cấp k, hiển nhiên N0 = |D0| = 1. Đối với mỗi cấp k, các máy chủ được phân vùng thành các tập con Nk, với mỗi máy chủ chạy một dịch vụ xác định vị trí đại diện chính xác một trong các miền Dk,t từ tập Dk.

Trong ví dụ này, cây đơn giản có bốn cấp với chín máy chủ với hai miền cấp 1, bốn miền cấp 2 và tám miền lá, địa chỉ của các thực thể được lưu trữ tại các máy chủ thuộc miền cấp 3. Giả sử địa chỉ của thực thể E được lưu trữ tại nút lá của máy chủ H3, như vậy dịch vụ xác định vị trí gốc cho thực thể E cũng chạy trên máy chủ này. Cần thiết phải lựa chọn một cách thận trọng dịch vụ xác định vị trí cho thực thể E nên đặt trên máy chủ nào, có thể kết hợp nguyên tắc thao tác cục bộ với  việc phân bổ đầy đủ các máy chủ cấp cao hơn thì có thể đáp ứng yêu cầu về qui mô hệ thống.

3.2.2       Đặt tên có cấu trúc

Đặt tên phi cấu trúc phù hợp các máy tính nhưng nó hoàn toàn không thân thiện với con người, con người cần những tên đơn giản dễ đọc và dễ nhớ, cho dù đó là tên của máy tính hay tên của các tập tin.

3.2.2.1     Không gian tên

Các tên thường được tổ chức thành không gian tên, không gian tên có cấu trúc có thể được thể hiện bằng đồ thị gán nhãn có hướng với hai loại nút: nút lá và nút thư mục. Nút lá đại diện cho thực thể được đặt tên và không có cạnh đi ra, nó chứa thông tin đại diện cho thực thể, ví dụ như địa chỉ để máy khách có thể truy nhập hoặc trạng thái của thực thể. Nút có các cạnh đi ra gọi là nút thư mục, mỗi cạnh được gán nhãn với tên cụ thể. Mỗi nút trong đồ thị  tên được coi là một thực thể khác trong hệ thống phân tán, đặc biệt nó có định danh liên kết. Nút thư mục lưu trữ bảng thư mục biểu diễn thông tin của các cạnh đi ra từ nút đó dưới dạng một cặp định danh và nhãn, nếu chỉ có các cạnh đi ra mà không có cạnh đi vào gọi là nút gốc, mỗi đồ thị có thể có nhiều nút gốc. Đường dẫn là chuỗi các nhãn của các cạnh liên tiếp giữa các nút, nếu nút đầu tiên là gốc thì gọi là đường đẫn tuyệt đối, ngược lại gọi là đường dẫn tương đối. Tên toàn cục là tên biểu thị cùng một thực thể trong toàn bộ hệ thống, tên cục bộ là tên mà ý nghĩa của nó phụ thuộc vào nơi đang được sử dụng, chỉ những thư mục chứa nó được biết.

Hình 3.6 Đồ thị tên đơn gốc

Cách mô tả đồ thị trên gần giống với hệ thống quản lý tập tin trên một máy tính, các nhãn trong đường dẫn được phân cách nhau bởi dấu gạch chéo, nếu tồn tại nhiều đường dẫn đến một nút thì nó sẽ biểu diễn bằng các tên đường dẫn khác nhau. Tên của các tài nguyên cũng được đặt giống như tên của các tập tin, cách tiếp cận này tương tự như việc cài đặt đồ thị tên cho các tài nguyên trong hệ thống phân tán. Hầu hết không gian tên chỉ có duy nhất một nút gốc, trong nhiều trường hợp nó được tổ chức chặt chẽ dưới dạng cây, khi đó mỗi nút chỉ có một cạnh đến, ngoại trừ nút gốc, kết quả là mỗi nút có chính xác một tên đường dẫn liên kết tuyệt đối. Trong thực tế cũng có thể có những không gian tên được biểu diễn dưới dạng đồ thị không tuần hoàn có hướng, có thể đến một nút bằng nhiều đường khác nhau nhưng không được phép tạo thành vòng tuần hoàn.

Ví dụ hệ thống quản lý tập tin của hệ điều hành Unix, nút thư mục đại diện cho thư mục còn nút lá đại diện cho tập tin, nút gốc là tên ổ đĩa logic. Ổ đĩa được chia thành nhiều khối kế tiếp nhau, chúng bao gồm khối khởi động dùng để nạp hệ điều hành khi sau khi bật máy tính, siêu khối để mô tả hệ thống tập tin, các nút chỉ mục và cuối cùng là các khối chứa dữ liệu của tập tin. Các nút chỉ mục chứa thông tin phục vụ cho tìm kiếm tập tin, nó cũng có thể chứa thông tin về thuộc tính của tập tin như chủ sở hữu, thời gian tạo, thời gian cập nhật cuối cùng…, nó cũng lưu trữ thông tin về các thư mục, do đó có thể thấy số chỉ mục tương ứng với một định danh của nút trong đồ thị tên.

3.2.2.2     Phân giải tên

Không gian tên cung cấp cơ chế thuận tiện để lưu trữ và truy xuất thông tin về các thực thể bằng tên, quá trình tra cứu thông tin dựa trên đường dẫn của tên gọi là phân giải tên. Đầu tiên nó phái truy vấn bảng thư mục để tìm ra dữ liệu thực được lưu trữ ở đâu, quá trình tìm kiếm tiếp diễn từ nút thư mục này qua nút thư mục khác, cuối cùng sẽ trả về định danh một nút. Như vậy việc phân giải tên chỉ có thể diễn ra nếu biết được bắt đầu từ nút nào trong không gian tên, nó còn gọi là cơ chế đóng, điều làm cho cơ chế này đôi khi khó hiểu là chúng nhất thiết phải ngầm hiểu từng phần của tên. Ví dụ nhìn vào chuỗi số “84986677028” chúng ta sẽ không hiểu đó là cái gì nếu như không biết rằng đó là số điện thoại di động, thông tin đó là đủ để bắt đầu quá trình phân giải.  Hệ thống quản lý tên trong hệ điều hành Unix phân biệt tên cục bộ và tên toàn cục, biến môi trường HOME được sử dụng để tham chiếu đến thư mục gốc của người dùng, mỗi người dùng có bản sao riêng của biến này được khởi tạo thành tên toàn cục tương ứng với thư mục chính của người dùng, cơ chế đóng gắn kết với các biến môi trường đảm bảo việc phân giải tên chính xác bằng cách tra cứu bảng dành riêng cho người dùng. Thực tế Unix coi nút chỉ mục đầu tiên của ổ đĩa là nút gốc, độ lệch thực tế của nó được tính toán từ dữ liệu lấy từ siêu khối. Ví dụ để phân giải tên /home/steen/mbox cần phải truy nhập vào bảng thư mục của núc gốc trong đồ thị tên, bản thân nút gốc đó cũng được tra cứu trong một đồ thị khác.

Bí danh là một tên khác của cùng một thực thể, về cơ bản có hai cách triển khai trong đồ thị tên. Cách thứ nhất là cho phép nhiều đường dẫn tuyệt đối tham chiếu đến cùng một nút, ví dụ thực thể các đường dẫn  /keys và /home/steen/keys đều trỏ đến nút n5. Cách thứ hai là biểu diễn một thực thể bằng nút lá nhưng nó không lưu trữ địa chỉ hay trạng thái mà lưu trữ đường dẫn tuyệt đối đến thực thể. Như vậy việc phân giải tên sẽ được thực hiện qua hai bước, bước thứ nhất lấy đường dẫn tuyệt đối được lưu trữ trong nút lá, sau đó mới phân giải đường dẫn này, cơ chế như vậy gọi là liên kết tên. Trên hình vẽ, bước thứ nhất phân giải để tìm nút lá n6, ở đó lưu trữ đường dẫn /keys, có được giá trị này sẽ tiếp tục phân giải lần thứ hai để đến được nút n5.

 

Phân giải tên cũng có thể được thực hiện trên hai không gian khác nhau, để thực hiện nhiệm vụ này thì cần phải có một nút thư mục được gọi là điểm gắn kết lưu giữ định danh từ một không gian khác, nút thư mục bên phía không gian tên cần gắn kết được gọi là điểm gắn. Điểm gắn kết được coi là một nút thư mục và thông thường nó  là gốc của không gian tên bên ngoài, như vậy quá trình phân giải sẽ bắt đầu bằng việc truy nhập bảng thư mục của nút này. Để gắn kết không gian tên của các máy tính khác nhau thì cần tối thiểu những thông tin sau:

-         Tên của giao thức truy nhập: Dùng để giao tiếp với máy tính của không gian tên bên ngoài.

-         Tên của máy chủ: Dùng để xác định địa chỉ của máy chủ quản lý không gian tên bên ngoài.

-         Tên của điểm truy nhập: Đó là tên của nút gắn kết của không gian tên bên ngoài, nó sẽ được phân giải thành định danh của nút trong không gian tên bên ngoài.

Nếu không phải là hệ thống phân tán thì ba thông tin trên không thực sự cần thiết, không cần phải có giao thức truy nhập cũng như tên của máy tính và điểm gắn kết, điểm gắn kết chỉ đơn giản là thư mục gốc của không gian tên bên ngoài. Tên của điểm gắn kết sẽ được máy chủ của không gian tên bên ngoài phân giải, nhưng cũng cần không gian tên cho giao thức truy nhập và tên của máy chủ, có thể sử dụng đường liên kết URL để đại diện cho cả ba thông tin này. Giao thức hệ thống tập tin mạng (NFS) cho phép các máy khách có thể truy nhập đến các tập tin cài đặt trên máy chủ, ví dụ đường liên kết nfs://ptit.edu.vn/home/student cho biết giao thức là NFS, tên máy chủ là ptit.edu.vn và điểm truy nhập là /home/student. Tên nfs đã được cộng đồng thế giới thống nhất cách phân giải, nó hiểu rằng cần phải triển khai giao thức NFS, tên máy chủ ptit.edu.vn sẽ được phân giải bằng dịch vụ tên miền DNS, như vậy chỉ còn /home/student sẽ được máy chủ của không gian tên bên ngoài phân giải.

Tổ chức tập tin trên máy khách do người dùng định nghĩa, nó chứa thư mục con  /remote gồm các điểm gắn kết với không gian tên bên ngoài, ví dụ trên hình vẽ thể hiện gắn kết không gian tên của máy chủ,  thư mục chính của PTIT sẽ sử dụng nút /ptit để lưu trữ đường liên kết nfs://ptit.edu.vn/home/student. Tên /remote/ptit/mbox được phân giải trên máy khách cho đến khi gặp nút /remote/ptit, sau đó tiếp tục bằng cách trả về đường liên kết nfs://ptit.edu.vn/home/student, máy khách sẽ sử dụng giao thức NFS để liên lạc với máy chủ để có thể truy nhập vào thư mục /home/student, quá trình phân giải tên sẽ tiếp tục trên máy chủ bằng cách đọc tập tin mbox.

Việc gắn kết hệ thống tập tin từ xa như đã mô tả trên cho phép máy khách có thể thực hiện các tập tin như thể chúng đang ở trên máy cục bộ, giả sử máy khách có tên là TM, người dùng có thể thực hiện các câu lệnh sau:

TM$ cd /remote/ptit

TM$ ls –l

Kết quả thực hiện hai lệnh trên sẽ hiển thị danh sách các tập tin trong thư mục /home/student trên máy chủ, người dùng hoàn toàn không biết thực tế đã lấy những dữ liệu đó từ máy chủ ngoại trừ thời gian có thể chậm hơn đôi chút so với việc liệt kê các tập tin trên máy cục bộ, dường như không gian tên bắt đầu từ /home/student đã hòa nhập vào không gian tên trên máy khách. Trong thực tế có nhiều cách để gắn kết không gian tên, với qui mô nhỏ chỉ cấn gán địa chỉ IP tĩnh cho các máy chủ sau đó cung cấp điểm gắn kết cho các máy khách. Giả sử máy chủ Vn cài đặt hệ điều hành Unix có địa chỉ IP là 192.168.3.102 lưu trữ các tập tin âm thanh trong thư mục /audio, thư mục này có thể chia sẻ như một điểm gắn kết để các máy khác trong mạng cục bộ có thể truy nhập. Ví dụ máy khách TM muốn gắn kết thư mục trên tại điểm gắn kết cục bộ /home/vn/audio thì chỉ cần thực hiện lệnh sau:

TM$ mount –t nfs 192.168.3.102:/audio /home/vn/audio

Nếu lệnh trên thực hiện thành công thì tất cả các tập tin trong thư mục /audio trên máy chủ sẽ được máy khách truy nhập trong thư mục /home/vn/audio.

3.2.2.3     Cài đặt không gian tên

Không gian tên là trái tim của dịch vụ đặt tên, dịch vụ này được cài đặt trên máy chủ định danh, nếu ở qui mô nhỏ thì chỉ cần một máy chủ, với qui mô lớn thì cần cài đặt trên nhiều máy chủ. Không gian tên cho hệ thống phân tán qui mô lớn thường được tổ chức theo dạng phân cấp, để tổ chức một cách hiệu quả người ta phân biệt ba lớp: lớp toàn cầu, lớp hành chính và lớp quản lý. Lớp toàn cầu được hình thành bởi các nút mức cao nhất, nghĩa là chỉ gồm nút gốc và các nút con của nó, tính ổn định của chúng khá cao, nghĩa là bảng thư mục của các nút này ít thay đổi, các nút như vậy thường đại diện cho các tổ chức. Lớp quản trị được hình thành thừ các nút thư mục do cùng một đơn vị quản lý, chúng đại diện cho các nhóm thực thể thuộc cùng một tổ chức, các nút ít khi thay đổi nhưng tính ổn định của nó thấp hơn lớp toàn cục. Cuối cùng là lớp quản lý bao gồm các nút có thể thay đổi thường xuyên, đó là các nút đại diện cho dịch vụ nào đó, khác với hai lớp trên, người dùng đầu cuối cũng có thể quản trị các nút thư mục thuộc lớp này.

Trên hình vẽ là một ví dụ về phân lớp trong không gian tên trên mạng Internet, chúng được chia thành các vùng không trùng lặp do một máy chủ quản lý. Xét về tính sẵn sàng và hiệu năng thì mỗi máy chủ phân giải tên miền sẽ phải đáp ứng các yêu cầu khác nhau, máy chủ ở lớp toàn cầu đòi hỏi tính sẵn sàng cao, nếu nó bị lỗi thì một lượng lớn tên miền sẽ không thể phân giải. Vấn đề hiệu suất có thể giải quyết bằng cách máy khách lưu trữ địa chỉ của tên miền trong bộ nhớ đệm, có thể kiểm tra bằng lệnh ipconfig /displaydns và xóa bằng lệnh ipconfig /flushdns. Như vậy chỉ lần đầu tiên truy nhập máy khách mới phải sử dụng dịch vụ phân giải tên, do đó các máy chủ lớp toàn cầu không cần phải đáp ứng nhanh các yêu cầu tra cứu, tuy nhiên phải cung cấp đủ băng thông phục vụ cho qui mô hàng triệu yêu cầu gửi đến. Để đáp ứng yêu cầu về tính sẵn sàng và hiệu năng thì các máy chủ lớp toàn cầu phải được nhân bản, do các tên miền không đòi hỏi cập nhật ngay lập tức cho nên sẽ vẫn duy trì được tính nhất quán cho các bản sao.

Tính sẵn sàng của các máy chủ ở lớp quản trị chủ yếu quan trọng đối với máy khách trong cùng một đơn vị với máy chủ phân giải tên, nếu bị lỗi thì không thể tra cứu tài nguyên trong tổ chức đó. Yêu cầu về hiệu năng cũng tương tự như ở lớp toàn cầu, các nút nói chung ít thay đổi, tuy nhiên nó đòi hỏi thời gian đáp ứng chỉ vài mili giây, như vậy các máy chủ lớp này cũng cần phải sử dụng bộ nhớ đệm, thời gian cập nhật thông tin cũng phải nhanh hơn ở lớp toàn cầu, do đó phải sử dụng các máy chủ cấu hình mạnh kết hợp với các chiến lược nhân bản nhưng vẫn phải đảm bảo tính nhất quán. Các yêu cầu về tính sẵn sàng của các máy chủ ở lớp quản lý thường ít khắt khe hơn nhưng hiệu năng lại là vấn đề rất quan trọng, thông tin các nút thay đổi thường xuyên đòi hỏi phải được cập nhật ngay lập tức.

Việc cài đặt các máy chủ phân giải tên tại lớp toàn cầu và lớp quản trị là phức tạp nhất, khó khăn không những phải đáp ứng các yêu cầu về tính sẵn sàng và hiệu năng mà còn ở khía cạnh nhất quán trong nhân bản. Vấn đề sẽ trở nên khó khăn hơn khi bộ nhớ đệm và các bản sao được trải rộng trên qui mô lớn, điều này có thể gây nên sự chậm trễ truyền thông trong quá trình tra cứu.

Mục

Toàn cầu

Khu vực

Trực tiếp

Phạm vi địa lý

Toàn thế giới

Tổ chức

Đơn vị

Số lượng nút

Ít

Nhiều

Rất nhiều

Thời gian đáp ứng

Giây

Mili giây

Ngay lập tức

Cập nhật lan truyền

Ít

Ngay lập tức

Ngay lập tức

Số lượng bản sao

Nhiều

Ít

Không có

Lưu yêu cầu máy khách?

Không cần

Mỗi thực thể đều có tên và địa chỉ tương ứng, việc ánh xạ từ tên đến địa chỉ của thực thể được thực hiện theo hai phương pháp: theo mô hình một lớp và theo mô hình hai lớp. Mô hình một lớp chỉ có một mức ánh xạ giữa tên và thực thể, mỗi lần thực thể thay đổi vị trí, ánh xạ cần phải được thay đổi theo. Mô hình hai lớp phân biệt tên và địa chỉ nhờ định danh thực thể, gồm quá trình tìm định danh thực thể tương ứng từ tên của thực thể được thực hiện bằng dịch vụ tên và quá trình xác định vị trí của thực thể từ định danh được thực hiện bởi dịch vụ định vị.

Không gian tên được phân bố trên nhiều máy chủ có ảnh hưởng đến việc phân giải tên, quá trình phân giải tên bắt đầu từ máy khách, nó kiểm tra xem tên miền đã có trong bộ nhớ đệm hay chưa, nếu chưa có thì sẽ gửi yêu cầu đến máy chủ phân giải tên đã được qui định trong cấu hình của thiết bị. Để biết địa chỉ của máy chủ này chỉ cần gõ lệnh ipconfig /all, sau khi nhận được yêu cầu của máy khách, máy chủ phân giải tên miền mặc định có thể sử dụng một trong hai phương pháp: phân giải tên tương tác và phân giải tên đệ quy. Phân giải tên tương tác thực hiện bằng cách truyền và nhận qua lại giữa máy khách và các máy chủ quản lý tên ở các mức khác nhau. Các máy chủ quản lý tên không trao đổi trực tiếp với nhau, mỗi máy chủ chỉ phân giải nhãn tương ứng với lớp để xác định địa chỉ của máy chủ tiếp theo, kết quả trả lại cho máy khách là địa chỉ của máy chủ quản lý tên kế tiếp và việc liên kết với máy chủ tiếp theo là do máy khách đảm nhiệm. Phân giải tên đệ quy thực hiện bằng cách mỗi máy chủ quản lý tên sẽ gửi kết quả đến máy chủ quản lý tên tiếp theo mà nó tìm thấy và cứ như vậy cho đến khi hoàn thành phân giải toàn bộ đường dẫn.

Ví dụ cần phải truy nhập trang http://www.ptit.edu.vn/index.html, như vậy cần phải phân giải tên miền www.ptit.edu.vn, theo lý thuyết đã trình bày trên, đường dẫn tuyệt đối sẽ là root:<vn, edu, ptit, www>. Để hiểu rõ hơn về qui trình phân giải tên miền, giả thiết máy khách không chứa bản ghi tên miền này trong bộ nhớ đệm, do đó nó phải đi qua tất cả các nút trong đồ thị tên để lấy địa chỉ của tên miền này. Nếu sử dụng phương pháp phân giải tên miền tương tác, tiến trình máy khách sẽ gửi thông điệp <vn, edu, ptit, www> đến máy chủ cấp cao nhất, máy chủ sẽ trả về cho máy khách một tham chiều đến nút <vn>, nhận được tham chiếu này, máy khách tiếp tục truy vấn nút máy chủ quản lý nút vn để yêu cầu phân giải <edu, ptit, www>, máy chủ quản lý nút vn lại trả về tham chiếu đến máy chủ quản lý nút <edu>. Máy khách lại gửi yêu cầu phân giải <ptit, www> đến máy chủ quản lý nút <edu>, máy chủ này lại trả về tham chiếu đến nút <ptit>. Máy khách tiếp tục gửi đến máy chủ quản lý nút <ptit> yêu cầu địa chỉ của <www>, máy chủ trả về địa chỉ của nút <www>, như vậy tiến trình phân giải đã hoàn thành, nó trả về cho ứng dụng địa chỉ của tên miền www.ptit.edu.vn để có thể truy vấn nội dung của trang index.html. Ưu điểm của phương pháp phân giải tên miền là tính phân tải được dải đều cho các máy chủ, tuy nhiên nhược điểm của nó là hiệu quả sử dụng tính năng lưu trữ địa chỉ trong bộ nhớ đệm tương đối thấp.

Nếu sử dụng phương pháp phân giải tên miền đệ qui, máy khách gửi yêu cầu phân giải <vn, edu, ptit, www> đến máy chủ tên miền gốc, máy chủ tên miền gốc sẽ gửi yêu cầu đến máy chủ quản lý nút vn, yêu cầu tiếp tục được chuyển đến máy chủ quản lý nút edu và sau đó chuyển đến máy chủ quản lý nút ptit. Máy chủ quản lý nút tìm kiếm tại nút lá www để lấy địa chỉ của tên miền, kết quả lần lượt chuyển ngược lại cho đến máy chủ tên miền gốc và trả về cho máy khách, khi đó tiến trình phân giải tên miền sẽ trả về cho tiến trình của ứng dụng đã yêu cầu.

Nhược điểm của phương pháp phân giải đệ qui nằm ở việc yêu cầu hiệu năng cao đối với các máy chủ phân giải tên, mỗi máy chủ sẽ phải đảm nhiệm việc phân giải hoàn chỉnh đối với đường dẫn đã yêu cầu. Tải cao nhất xảy ra tại máy chủ tên miền gốc, do đó máy chủ này chỉ nên hỗ trợ cho phân giải tên theo phương pháp tương tác. Ưu điểm của phương pháp phân giải đệ qui nằm ở hiệu quả sử dụng bộ nhớ đệm tốt hơn và có thể giảm lượng thông tin trao đổi trên mạng, địa chỉ của các máy chủ định danh cấp thấp hơn lần lượt được lưu trong bộ nhớ đệm, điều đó sẽ cải thiện đáng kể hiệu năng cho hệ thống. Các nút mức toàn cầu mà mức quản trị thường ít khi thay đổi, máy chủ gốc sử dụng bộ nhớ đệm hiệu quả hơn so với phương pháp tương tác, các máy chủ cấp thấp hơn cũng quản lý bộ nhớ đệm theo cách tương tự. Kết quả tra cứu trung gian cũng có thể được lưu vào bộ nhớ đệm, kết quả tổng thể quá trình phân giải và lưu kết quả trong bộ nhớ đệm như sau:

Máy chủ

Yêu cầu

phân giải

Tìm

kiếm

Gửi cấp

thấp hơn

Nhận và lưu

bộ nhớ đệm

Trả kết quả

cho máy yêu cầu

ptit

<www>

#<www>

-

-

#<www>

edu

<ptit,www>

#<ptit>

<www>

#<www>

#<ptit>

#<ptit,www>

vn

<edu,ptit,www>

#<edu>

<ptit,www>

#<www>

#<ptit,www>

#<edu>

#< edu,ptit>

#<edu,ptit,www>

Gốc

<vn,edu,ptit,www>

#<vn >

<edu,ptit,www>

 

#<vn>

#<vn,edu >

#<vn,edu,ptit>

#<vn>

#<vn,edu>

#<vn,edu,ptit>

#<vn,edu,ptit,www>

Lợi ích chính của phương pháp lưu trữ này là các hoạt động tra cứu có thể được xử lý khá hiệu quả, máy chủ cấp trên có thể liên lạc với bất kỳ máy chủ nào cấp dưới mà không cần phải đi tuần tự theo các nhánh của cây. Lợi ích thứ hai là chi phí về truyền thông, các gói tin có thể sẽ đi qua ít thiết bị định tuyến hơn nếu các máy chủ phân giải tên miền được lắp đặt trong cùng  khu vực.

Đối với phân giải tên miền tương tác, bộ nhớ đệm bị giới hạn cho tiến trình phân giải, nếu nhiều máy tính trong mạng cục bộ đều có nhu cầu phân giải một tên miền thì quá trình thực hiện sẽ như nhau trên tất cả các máy, cho dù đó là những yêu cầu giống nhau. Giải pháp cho vấn đề này là xây dựng một máy chủ trung gian tiếp nhận yêu cầu của máy khách và máy chủ trung gian đó sẽ tiếp nhận yêu cầu của các máy khách, máy khách sẽ không liên lạc trực tiếp đến các máy chủ tên miền. Khi nhận được yêu cầu phân giải tên miền từ các máy khách, máy chủ trung gian sẽ tìm kiếm trong bộ nhớ đệm, nếu tìm thấy bản ghi tên miền hợp lệ thì trả ngay địa chỉ cho máy khách, nếu không nó thực hiện quá trình phân giải tương tác như đã trình bày trên.

Ví dụ cấu hình card mạng trên máy tính qui định máy chủ phân giải tên có địa chỉ 216.146.35.35. để phân giải tên miền www.ptit.edu.vn máy khách máy khách sẽ kiểm tra bộ đệm xem tên miền đã có trong bộ đệm hay chưa, nếu chưa có nó sẽ gửi yêu cầu phân giải đến máy chủ 216.146.35.35, nếu tìm thấy bản ghi của tên miền trong bộ nhớ đệm thì nó trả về ngay địa chỉ. Nếu không tìm thấy, máy chủ trung gian sử dụng phương pháp phân giải tên miền tương tác, yêu cầu được chuyển đến máy chủ cấp cao nhất opendns.com, nó trả về địa chỉ máy chủ quản lý tên miền vn, kết nối đến máy chủ quản lý nút vn nó nhận được địa chỉ máy chủ quản lý nút edu, tiếp tục kết nối đến máy chủ quản lý nút edu nó nhận được địa chỉ máy chủ quản lý tên ptit, cuối cùng kết nối đến máy chủ quản lý nút ptit nó nhận được địa chỉ của máy chủ cài đặt dịch vụ web cho tên miền www.ptit.edu.vn, địa chỉ này sẽ được chuyển cho máy khách.

3.2.2.4     Hệ thống tên miền trên Internet

Một trong những dịch vụ đặt tên phân tán lớn nhất hiện nay là hệ thống tên miền của mạng Internet, hệ thống này được phát minh vào năm 1984 cho phép thiết lập tương ứng giữa địa chỉ IPtên miền. Hệ thống tên miền là một hệ thống đặt tên theo thứ tự cho máy tính, dịch vụ hoặc bất kì nguồn lực nào tham gia vào mạng Internet. DNS liên kết nhiều thông tin đa dạng với tên miền được gán cho những thành phần tham gia và chuyển tên miền thân thiện với con người vào định danh của tên đó. Ví dụ tên miền www.ptit.edu.vn dễ nhớ đối với con người nhưng lại không áp dụng được cho việc định tuyến, trước khi tham gia định tuyến tên miền này sẽ phải được chuyển đổi thành địa chỉ của máy chủ đang cài đặt dịch vụ web cho trang này.

Tên miền nên được đặt đơn giản và có tính chất gợi nhớ với mục đich và phạm vi hoạt động của chủ sở hữu tên miền. Mỗi tên miền gồm tối đa 63 ký tự bao gồm cả dấu chấm. Tên miền được đặt bằng các ký tự (a-z A-Z 0-9) và ký tự gạch ngang “-”, một tên miền đầy đủ có chiều dài không vượt quá 255 ký tự. Hệ thống tên miền sẽ phân chia trách nhiệm gán tên miền và lập bản đồ ánh xạ tên với địa chỉ IP bằng cách định rõ những máy chủ có thẩm quyền cho mỗi loại tên miền. Những máy chủ có thẩm quyền được phân công chịu trách nhiệm đối với tên miền riêng của họ và lần lượt có thể chỉ định tên máy chủ khác cho các tên miền phụ. Ban đầu, tất cả các tên miền và địa chỉ IP tương ứng được lưu giữ trong tập tin tại trung tâm thông tin mạng của Mỹ. Tuy nhiên khi hệ thống Internet phát triển, việc lưu giữ thông tin trong một tập không thể đáp ứng nhu cầu phân phối và cập nhật, vì vậy hệ thống tên miền DNS đã phát triển dưới dạng các cơ sở dữ liệu phân tán, mỗi cơ sở dữ liệu này sẽ quản lý một phần trong hệ thống tên miền.

Hiện nay hệ thống tên miền trên thế giới được phân bố theo cấu trúc hình cây, tên miền cấp cao nhất là tên miền gốc được thể hiện bằng dấu chấm. Dưới tên miền gốc có hai loại tên miền là tên miền cấp cao dùng chung và tên miền cấp cao quốc gia  như .vn, .jp, .kr, .…. Tên miền cấp cao dùng chung hiện nay do tổ chức ICANN (Internet Coroperation for Assigned Names and Numbers) quản lý, tham khảo tại địa chỉ https://www.icann.org/resources/pages/listing-2012-02-25-en. Tên miền cũng có thể được phân theo lĩnh vực hoạt động gồm các loại sau:

-         COM, BIZ: các tổ chức, cá nhân hoạt động thương mại.

-         EDU:  các tổ chức, cá nhân hoạt động trong lĩnh vực giáo dục, đào tạo.

-         GOV: các cơ quan, tổ chức nhà nước ở trung ương và địa phương.

-         NET: các tổ chức, cá nhân hoạt động trong lĩnh vực thiết lập và cung cấp dịch vụ mạng.

-         ORG:  các tổ chức hoạt động trong lĩnh vực chính trị, văn hoá, xã hội.

-         INT: các tổ chức quốc tế.

-         AC: các tổ chức, cá nhân hoạt động trong lĩnh vực nghiên cứu.

-         PRO: các tổ chức, cá nhân hoạt động trong lĩnh vực chuyên ngành cao.

-         INFO: các tổ chức, cá nhân hoạt động trong lĩnh vực cung cấp thông tin.

-         HEALTH: các tổ chức, cá nhân hoạt động trong lĩnh vực dược, y tế.

NAME: tên riêng của cá nhân tham gia hoạt động Internet.

Hệ thống tên miền được sắp xếp theo cấu trúc phân cấp, mức trên cùng được gọi là gốc và ký hiệu là “.”, tổ chức ICANN đảm nhiệm vai trò quản lý mức cao nhất của hệ thống tên miền mức cao nhất do đó nó có quyền cấp phát các tên miền dưới mức này. Giả sử có tên miền www.ptit.edu.vn sẽ được nhận dạng từ phải qua trái, mục đầu tiên của tên miền này là vn nghĩa là thuộc về Việt Nam, tiếp theo đó edu nghĩa là đơn vị giáo dục, ptit là tên chủ sở hữu yêu cầu và www  nghĩa là trang tin điện tử. Theo cấu trúc và cách phân chia trong không gian tên miền đã trình bày ở trên, người dùng khi gặp một tên miền hoàn toàn có thể biết tổ chức quản lý tên miền này thuộc lĩnh vực gì, hay tên miền này do quốc gia nào quản lý... Tên miền tận cùng bằng .vn do đó tên miền này thuộc vùng do Việt Nam quản lý,  cụ thể là Trung tâm Internet Việt Nam (VNNIC), tiếp sau là tên miền cấp 2 edu, nghĩa là tên miền này được phân cho tổ chức hoạt động trong lĩnh vực giáo dục.

Máy chủ tên miền là máy chủ chứa cơ sở dữ liệu dùng cho việc chuyển đổi giữa tên miền và địa chỉ IP. Như cách phân cấp của hệ thống tên miền, tương ứng với mỗi cấp và mỗi loại tên miền có máy chủ tên miền phục vụ tên miền ở cấp và loại tên miền đó. Máy chủ tên miền gốc sẽ chứa cơ sở dữ liệu quản lý tên miền ở mức toàn cầu, ở mức quốc gia sẽ có máy chủ tên miền quản lý tên miền mức quốc gia. Hệ thống tên miền định nghĩa hai kiểu máy chủ tên miền là máy chủ tên miền chính và máy chủ tên miền phụ. Máy chủ tên miền chính là máy chủ tên miền lấy dữ liệu cho các vùng của nó từ các tập tin có sẵn trên máy, máy chủ tên miền phụ là máy chủ tên miền lấy dữ liệu cho các khu vực của nó từ một máy chủ tên miền chính khác. Khi máy chủ phụ khởi động nó sẽ kết nối đến máy chủ chính để lấy dữ liệu từ máy này về cho các khu vực mà nó quản lý, quá trình lấy dữ liệu từ máy chính về máy phụ được gọi là chuyển vùng.

Máy chủ tên miền ở mức cao nhất là máy chủ tên miền chứa các thông tin để tìm kiếm các máy chủ tên miền ủy quyền cho các tên miền thuộc mức cao nhất. Máy chủ gốc có thể đưa ra các truy vấn  để tìm kiếm tối thiểu là các thông tin về địa chỉ của các máy chủ tên miền ủy quyền thuộc mức cao nhất chứa tên miền muốn tìm. Sau đó, các máy chủ tên miền ở mức top-level-domain có thể cung cấp các thông tin về địa chỉ của máy chủ ủy quyền cho tên miền ở mức thứ cấp chứa tên miền muốn tìm, quá trình tìm kiếm tiếp tục cho đến khi chỉ ra được máy chủ tên miền authority cho tên miền muốn tìm. Theo cơ chế hoạt động trên máy chủ tên miền đóng vai trò quan trọng trong việc tìm kiếm một tên miền bất kỳ trên không gian tên miền. Quá trình tìm kiếm tên miền luôn được bắt đầu bằng các truy vấn gửi cho máy chủ gốc, nếu như các máy chủ tên miền gốc không hoạt động, quá trình tìm kiếm tên miền sẽ không được thực hiện. Để tránh điều này không xảy ra, trên mạng Internet hiện tại có 13 hệ thống máy chủ tên miền gốc, các máy chủ tên miền này nói chung và ngay trong cùng một hệ thống cũng được đặt tại nhiều vị trí khác nhau trên mạng Internet.

Giả sử người sử dụng muốn truy cập vào trang tin điện tử có tên miền là www.vnn.vn. Trước hết chương trình trên máy người sử dụng gửi yêu cầu tìm kiếm địa chỉ IP ứng với tên miền www.vnn.vn tới máy chủ quản lý tên miền cục bộ thuộc mạng của nó. Máy chủ tên miền cục bộ này kiểm tra trong cơ sở dữ liệu của nó có chứa cơ sở dữ liệu chuyển đổi từ tên miền sang địa chỉ IP của tên miền mà người sử dụng yêu cầu không. Trong trường hợp máy chủ tên miền cục bộ có cơ sở dữ liệu này, nó sẽ gửi trả lại địa chỉ IP của máy có tên miền nói trên. Trong trường hợp máy chủ tên miền cục bộ không có cơ sở dữ liệu về tên miền này nó sẽ hỏi lên các máy chủ tên miền ở mức cao nhất, nghĩa là máy chủ tên miền làm việc ở mức ROOT. Máy chủ tên miền ở mức ROOT này sẽ chỉ cho máy chủ tên miền cục bộ địa chỉ của máy chủ tên miền quản lý các tên miền .VN, máy chủ tên miền cục bộ gửi yêu cầu đến máy chủ quản lý tên miền .VN tìm tên miền www.vnn.vn. Máy chủ tên miền quản lý các tên miền .VN sẽ gửi lại địa chỉ của máy chủ quản lý tên miền vnn.vn.

 

Hình 3.8 Các bước thực hiện trong phân giải tên miền

 

Máy chủ tên miền cục bộ sẽ hỏi máy chủ quản lý tên miền  vnn.vn  này địa chỉ IP của tên miền www.vnn.vn. Do máy chủ quản lý tên miền vnn.vn có cơ sở dữ liệu về tên miền www.vnn.vn nên địa chỉ IP của tên miền này sẽ được gửi trả lại cho máy chủ tên miền cục bộ. Máy chủ tên miền cục bộ chuyển thông tin tìm được đến máy của người sử dụng. Người sử dụng dùng địa chỉ IP này để kết nối đến server chứa trang web có địa chỉ www.vnn.vn. Khi khai báo tên miền, các bản ghi dữ liệu tên miền gồm những loại sau:

-         Bản ghi kiểu A: được dùng để khai báo ánh xạ giữa tên của một máy tính trên mạng và địa chỉ IP tương ứng của nó. Nói cách khác, bản ghi kiểu A chỉ ra tên và điạ chỉ IP của một máy tính trên mạng.Bản ghi kiểu A có cú pháp như sau: 

domain IN A <địa chỉ IP của máy>

Ví dụ: home.vnn.vn IN A 203.162.0.12

Theo ví dụ trên, tên miền home.vnn.vn được khai với bản ghi kiểu A trỏ đến địa chỉ 203.162.0.12 sẽ là tên của máy tính này. Một tên miền có thể được khai nhiều bản ghi kiểu A khác nhau để trỏ đến các địa chỉ IP khác nhau. Như vậy có thể có nhiều máy tính có cùng tên trên mạng. Ngược lại một máy tính có một địa chỉ IP có thể có nhiều tên miền trỏ đến, tuy nhiên chỉ có duy nhất một tên miền được xác định là tên của máy, đó chính là tên miền được khai với bản ghi kiểu A trỏ đến địa chỉ của máy. 

-         Bản ghi AAAA: được dùng để chuyển đổi từ tên miền sang địa chỉ IPv6. Giống như bản ghi kiểu A trong địa chỉ IPv4, một tên miền có thể được khai nhiều bản ghi kiểu AAAA khác nhau để trỏ đến các địa chỉ IPv6 khác nhau. Bản ghi kiểu AAAA có cú pháp như sau: 

domain IN AAAA <địa chỉ IPv6 của máy>

Ví dụ: 

ipv6.vnnic.net IN AAAA 2001:dc8:5::115

Khai báo trên cho thấy tên miền ipv6.vnnic.net là tên được đặt cho máy tính có địa chỉ 2001:dc8:5::115 trên mạng Internet.

-         Bản ghi CNAME: Bản ghi CNAME cho phép một máy tính có thể có nhiều tên, nói cách khác bản ghi CNAME cho phép nhiều tên miền cùng trỏ đến một địa chỉ IP cho trước. Để có thể khai báo bản ghi CNAME, bắt buộc phải có bản ghi kiểu A để khai báo tên của máy. Tên miền được khai báo trong bản ghi kiểu A trỏ đến địa chỉ IP của máy được gọi là tên miền chính (canonical domain). Các tên miền khác muốn trỏ đến máy tính này phải được khai báo là bí danh của tên máy (alias domain). Cú pháp của bản ghi CNAME:

alias-domain IN CNAME canonical domain.

Ví dụ:

www.vnn.vn IN CNAME home.vnn.vn.

Tên miền www.vnn.vn sẽ là tên bí danh của tên miền home.vnn.vn , hai tên miền www.vnn.vn và home.vnn.vn sẽ cùng trỏ đến địa chỉ IP 203.162.0.12.

-         Bản ghi MX: dùng để khai báo trạm chuyển tiếp thư điện tử của một tên miền. Ví dụ, để các thư điện tử có cấu trúc user@vnn.vn được gửi đến trạm chuyển tiếp thư điện tử có tên mail.vnn.vn , trên cơ sở dữ liệu của DNS cần khai báo bản ghi MX như sau:

vnn.VN IN MX 10 mail.vnn.vn

Các thông số được khai báo trong bản ghi MX nêu trên gồm có: 

vnn.vn : là tên miền được khai báo để sử dụng như địa chỉ thư điện tử. 

mail.vnn.vn: là tên của trạm chuyển tiếp thư điện tử, nó thực tế là tên của máy tính dùng làm trạm chuyển tiếp thư điện tử. 

10 : Là giá trị ưu tiên, giá trị ưu tiên có thể là một số nguyên bất kỳ từ 1đến 255, nếu giá trị ưu tiên này càng nhỏ thì trạm chuyển tiếp thư điện tử được khai báo sau đó sẽ là trạm chuyển tiếp thư điện tử được chuyển đến đầu tiên. Ví dụ nếu khai báo: 

vnn.vn IN MX 10 mail.vnn.vn

vnn.vn IN MX 20 backupmail.vnn.vn

thì tất cả các thư điện tử có cấu trúc địa chỉ user@vnn.vn trước hết sẽ được gửi đến trạm chuyển tiếp thư điện tử mail.vnn.vn. Chỉ trong trường hợp máy chủ mail.vnn.vn không thể nhận thư thì các thư này mới được chuyển đến trạm chuyển tiếp thư điện tử backupmail.vnn.vn.

-         Bản ghi NS: dùng để khai báo máy chủ tên miền cho một tên miền, nó cho biết các thông tin về tên miền này được khai báo trên máy chủ nào. Với mỗi một tên miền phải có tổi thiểu hai máy chủ tên miền quản lý, do đó yêu cầu có tối thiểu hai bản ghi NS cho mỗi tên miền. Cú pháp của bản ghi NS:

<tên miền> IN NS <tên của máy chủ tên miền>

Ví dụ:

vnnic.net.VN. IN NS dns.vnnic.net.vn.
Với khai báo trên, tên miền vnnic.net.vn sẽ do máy chủ tên miền có tên dns.vnnic.net.vn quản lý. Điều này có nghĩa, các bản ghi như A, CNAME, MX ... của tên miền vnnic.net.vn và các tên miền cấp dưới của nó sẽ được khai báo trên máy chủ dns.vnnic.net.vn. 

-         Bản ghi PTR: Hệ thống DNS không những thực hiện việc chuyển đổi từ tên miền sang địa chỉ IP mà còn thực hiện chuyển đổi địa chỉ IP sang tên miền. Bản ghi PTR cho phép thực hiện chuyển đổi địa chỉ IP sang tên miền.Ví dụ:

12.0.162.203.in-addr.arpa IN PTR home.vnn.vn
Bản ghi PTR trên cho phép tìm tên miền home.vnn.vn khi biết địa chỉ IP mà tên miền trỏ tới. 

-         Bản ghi NAPTR: là bản ghi đặc biệt trong hệ thống tên miền, chứa đựng thông tin về các nguồn, những dịch vụ và ứng dụng nào sẽ được kết hợp với một số điện thoại xác định. Những dịch vụ này được xác định và lựa chọn bởi khách hàng.
Cú pháp của bản ghi NAPTR:

<tên miền>IN NAPTR<thứ tự><mức ưu tiên><cờ><dịch vụ><biểu thức><thay thế>

Ví dụ:

5.1.1.6.2.2.8.4.4.8.e164.arpa.IN NAPTR 10 10 “u”“mailto+E2U”“!^.*$!mailto:xxx@vnnic.net!”
Với khai báo trên, khi thực hiện gọi số máy +84-xx-xxxxxxxx thì sẽ thu được mailto:xxx@vnnic.net. Với bản ghi này có thể triển khai dịch vụ dựa trên hệ thống máy chủ DNS như ENUM và có thể mang lại sự hội tụ giữa viễn thông và Internet.

3.2.3    Đặt tên dựa trên thuộc tính

Đặt tên phi cấu trúc hay đặt tên có cấu trúc đều bảo đảm tham chiếu  đến một thực thể duy nhất một cách độc lập với vị trí của thực thể đó. Trong thực tế, hai tiêu chí thân thiện với người dùng và độc lập vị trí là chưa đủ, người dùng muốn tìm kiếm các thực thể dựa trên các thuộc tính của chúng, mô tả càng nhiều thuộc tính càng tốt. Có nhiều cách mô tả thực thể nhưng cách phổ biến là mô tả thực thể theo cặp thuộc tính và giá trị, phương pháp này gọi là đặt tên theo thuộc tính. Một thực thể bao gồm nhiều thuộc tính liên quan với nhau, mỗi thuộc tính thể hiện đặc điểm của thực thể, bằng cách xác định giá trị của các thuộc tính sẽ hạn chế được tập các thực thể cần tìm.

Nếu tên được phân ra thành nhiều thuộc tính thì có thể lợi dụng thứ tự các thuộc tính, ví dụ người sử dụng với thuộc tính tên là <A>, thuộc tính tổ chức là <FOT> và thuộc tính quốc gia là <VN> thì có thể tạo ra thành một thuộc tính tổng hợp là <A.FOT.VN>. Tổng quát hơn, khi không cho thứ tự các thuộc tính thì có thể xác đinh thực thể nhờ tập hợp tất cả các thuộc tính, ví dụ U=A, C=FOT, O=VN, trong đó đó U, C và O đại diện cho các thuộc tính tên, cơ quan và quốc gia. Những tên này được xác định dựa vào việc ghép nối kế tiếp các thuộc tính dựa vào tên cấu trúc phân cấp hoặc dựa vào chỉ tập hợp các thuộc tính với cấu trúc tùy ý. Việc phân chia thuộc tính cho giải pháp tên của đối tượng có thể căn cứ vào tính chất vật lý, theo tổ chức hoặc theo chức năng.

3.2.3.1     Dịch vụ thư mục

Hệ thống đặt tên dựa trên thuộc tính còn gọi là dịch vụ thư mục, mỗi thực thể có tập các thuộc tính liên quan dùng để tìm kiếm. Xác định các thuộc tính cho thực thể không phải là vấn đề đơn giản, trong nhiều trường hợp cần phải thực hiện thủ công. Dịch vụ thư mục tương tự với một từ điển, nó cho phép tra cứu tên và thông tin liên kết với tên đó. Mỗi từ có thể hiểu theo nhiều nghĩa, do đó một tên có thể được kết hợp với nhiều thông tin khác nhau. Thực tế cho thấy ngay cả khi có sự đồng thuận về tập các thuộc tính thì vẫn chưa chắc đạt được tính nhất quán cho một nhóm người dùng. Để giảm bớt sự phức tạp này, các nghiên cứu đã được tiến hành nhằm thống nhất cách mô tả các thực thể, một khung mô tả tài nguyên đã được sử dụng trong các hệ thống phân tán, về cơ bản nó là cặp ba (chủ thể, thuộc tính và giá trị), nếu lưu trữ bản ghi này thì có thể truy vấn theo thuộc tính để tìm thông tin liên quan đến chủ thể.

Mỗi tài nguyên trên mạng được xem là một đối tượng trong thư mục máy chủ, thông tin về một tài nguyên được lưu giữ như là thuộc tính của đối tượng đó. Khác với hệ thống đặt tên có cấu trúc, việc tìm kiếm giá trị trong hệ thống đặt tên dựa trên thuộc tính đòi hỏi tìm kiềm toàn diện thông qua tất cả các bộ mô tả, có thể tránh được tìm kiếm toàn diện bằng cách lập các bảng chỉ mục. Khi tìm kiếm chỉ cần gửi yêu cầu đến các máy chủ dịch vụ thư mục, nhưng số lượng rất lớn, gửi hàng trăm câu lệnh truy vấn không phải là cách hay, do đó cần phải có các giải pháp tìm kiếm đối với loại hình này.

3.2.3.2     Cài đặt phân cấp

Cách tiếp cận phổ biến để giải quyết dịch vụ thư mục phân tán là kết hợp đặt tên có cấu trúc với đặt tên dựa trên thuộc tính, nó đã được áp dụng rộng rãi trong các dịch vụ hệ thống phân tán. Nhiều hệ thống sử dụng hoặc dựa vào giao thức truy nhập hạng nhẹ (LDAP), nó bắt nguồn từ dịch vụ thư mục X.500 do hai tổ chức quốc tế ITU và ISO xây dựng. Ban đầu tiêu chuẩn này dùng để để hỗ trợ các yêu cầu của các nhà cung cấp dịch vụ nhắn tin và tra cứu tên mạng. Giao thức LDAP dựa trên các dịch vụ thư mục thông tin của X.500 nhưng sử dụng TCP/IP và một chuỗi mã hóa chương trình của giao thức X.500 DAP, nó liên quan nhiều hơn trên Internet. Một dịch vụ thư mục LDAP bao gồm các bản ghi thể hiện các phần trong thư mục, mỗi bản ghi là tập hợp của các cặp (thuộc tính, giá trị), mỗi thuộc tính có một kiểu liên kết, nó có thể là đơn trị hoặc đa trị.

Thuộc tính

Viết tắt

Giá trị

Country

C

vn

Locality

L

Hanoi

Organization

O

Ministry of Information and Communications

Organization Unit

OU

Posts and Telecommunications Institute of Technology

CommonName

CN

Main server

WebServer

-

222.255.113.97,  203.162.88.119, 203.162.10.122

MailServer

-

123.30.182.167

Ví dụ trên sử dụng tiêu chuẩn LDAP để mô tả Học viện Công nghệ Bưu chính viễn thông, thuộc tính WebServer nhận dữ liệu đa trị, các thuộc tính khác nhận dữ liệu đơn trị. Tập hợp tất cả các mục trong dữ liệu của LDAP gọi là cơ sở thông tin thư mục, mỗi bản ghi được xác định duy nhất để có thể tra cứu, một tên duy nhất trên toàn cầu xuất hiện dưới dạng chuỗi các thuộc tính đặt tên trong mỗi bản ghi, mỗi thuộc tính đặt tên gọi là tên phân biệt tương đối. Trong ví dụ trên, năm thuộc tính đầu tiên đều là các thuộc tính đặt tên, chúng tạo thành tên duy nhất trên toàn cầu, tương tự như tên miền ptit.edu.vn. Giống như hệ thống tên miền, việc sử dụng các tên duy nhất trên toàn cầu bằng cách liệt kê các tên tương đối theo thứ tự dẫn đến hệ thống phân cấp của tập hợp các mục dữ liệu và được gọi là cây thông tin thư mục, đó là đồ thị tên của dịch vụ thư mục.

 

Thuộc tính

Giá trị

Thuộc tính

Giá trị

Country

vn

Country

vn

Locality

Hanoi

Locality

Hanoi

Organization

Ministry of Information and Communications

Organization

Ministry of Information and Communications

Organization Unit

Posts and Telecommunications Institute of Technology

Organization Unit

Posts and Telecommunications Institute of Technology

CommonName

Main server

CommonName

Main server

HostName

web

HostName

mail

HostAddress

222.255.113.97,  203.162.88.119, 203.162.10.122

HostAddress

123.30.182.167

Nút N đóng vai trò là nút thư mục và là cha của hai nút lá thuộc tính bổ sung HostName, nó đóng vai trò như một nút thư mục trên đồ thị tên và cũng là bản ghi của LDAP, thao tác đọc (read) sẽ dùng để đọc bản ghi duy nhất có tên đường dẫn trong cây thông tin thư mục, thao tác liệt kê (list) các cạnh của đi ra từ một nút. Việc cài đặt dịch vụ thư mục tương tự như cách triển khai dịch vụ đặt tên, nó hỗ trợ nhiều thao tác tra cứu hơn. Khi xử lý thư mục có qui mô lớn, cây thông tin thư mục sẽ được cài đặt trên máy chủ gọi là đại lý dịch vụ thư mục (DSA), mỗi phần của cây thông tin thư mục sẽ tương ứng với một vùng trong hệ thống đặt tên, mỗi DSA hoạt động như một máy chủ định danh thông thường nhưng có thêm các tính năng tìm kiếm nâng cao. Trên máy khách có một tiến trình phân giải tên gọi là DSA, nó trao đổi thông tin với DUA theo giao thức truy nhập đã được chuẩn hóa.

Điểm khác biệt giữa LDAP và DNS nằm ở các phương tiện tìm kiếm thông qua cơ sở thông tin thư mục, nó tìm kiếm các mục dựa trên các tiêu chí của các thuộc tính đã nhập. Ví dụ, để tìm kiếm các máy chủ chính của các đơn vị trực thuộc Bộ thông tin và truyền thông Việt Nam chỉ cần thực hiện lệnh sau:

search(“(C=vn)(O= Ministry of Information and Communications) (OU=*)

              (CN=Main server)”)

Tìm kiếm trong dịch vụ thư mục thường là hoạt động tốn kém, câu lệnh trên đòi hòi phải tìm kiếm các mục dữ liệu cho mỗi đơn vị của Bộ thông tin và truyền thông sau đó kết hợp kết quả tìm kiếm với nhau, nghĩa là phải truy nhập vào một số nút lá của cây thông tin thư mục, trong khi đó dịch vụ tên miền chỉ cần truy nhập một nút lá duy nhất. LDAP cho phép một số cây cùng tồn tại trong khi chúng được liên kết với nhau, điều này dẫn đến một rừng các miền LDAP, do đó cần cài đặt một máy chủ danh mục chung để chỉ ra cần tìm kiếm trên những miền nào. Mặc dù bản thân LDAP sử dụng hệ thống phân cấp để đáp ứng yêu cầu về qui mô, thông thường người ta kết hợp LDAP với DNS, khi đó mọi cây trong LDAP đều có thể truy nhập từ gốc. Tiêu chuẩn LDAP/X.500 đang được áp dụng phổ biến trong các sản phẩm như Novell eDirectory, Red Hat Directory Server, Microsoft Active Directory, Apple’s Mac Open Directory,  Apache Directory Server, Oracle Internet Directory.

3.2.3.3     Cài đặt không tập trung   

Với sự ra đời của các hệ thống ngang hàng, các nhà nghiên cứu cũng đang tìm kiếm những giải pháp phi tập trung hóa hệ thống đặt tên dựa trên thuộc tính. Hệ thống ngang hàng thường được sử dụng để lưu trữ các tập tin, nó chỉ cung cấp tính năng tra cứu dựa trên khóa mà không hỗ trợ các tính năng tìm kiếm. Tuy nhiên, nếu có thể tìm kiếm được tập tin dựa trên bộ mô tả thì đó là điều rất tiện lợi, trong đó bộ mô tả là cặp (thuộc tính, giá trị), vấn đề mấu chốt ở đây là phải tổ chức sao cho quá trình tìm kiếm thực hiện tốt nhất. Việc truy vấn mọi mút trong hệ thống ngang hàng để xem nó có chứa tập tin khớp với các cặp thuộc tính hay không là điều không khả thi, những gì cần làm là ánh xạ các cặp (thuộc tính, giá trị) đến các máy chủ chỉ mục trở đến các tập tin phù hợp với các cặp thuộc tính và giá trị đó.

Ý tưởng xây dựng cây chỉ mục phân tán là truy vấn tìm kiếm được thể hiện dưới dạng danh sách các cặp (thuộc tính, giá trị), kết quả trả về là danh sách tham chiếu đến các thực thể phù hợp với những giá trị của các thuộc tính. Ví dụ trường hợp hệ thống ngang hàng lưu trữ tập tin, danh sách trả về là các khóa của các tập tin có liên quan, từ đó máy khách có thể sử dụng lần lượt từng khóa để tra cứu các tập tin. Giả sử có M thuộc tính khác nhau, có thể sử dụng máy chủ nào đó cho mỗi thuộc tính, máy chủ cho thuộc tính A duy trì tập hợp các cặp (E, ValA) cho mỗi thực thể E có giá trị ValA cho thuộc tính A, một câu truy vấn tìm kiếm

search(“(C=vn)(O= Ministry of Information and Communications) (OU=*)

              (CN=Main server)”)

sẽ được gửi đến các máy chủ tương ứng cho các thuộc tính C, O và CN, sau đó máy khách sẽ xem thực thể nào xuất hiện trong cả ba tập hợp do các máy chủ trả về, mỗi máy chủ có thể phân vùng thêm để giảm số lượng tập thực thể trên mỗi máy. Giả sử có tập thuộc tính {a1,a2,..,aN}, mỗi thuộc tính ak liên kết với tập Sk = {Sk1,.., Sknk} của nk máy chủ và ak nhận giá trị từ tập Rk, xây dựng ánh xạ toàn cục F như sau:

F(ak, v) = Skj với  Skj ϵ Sk và v ϵ Rk

Áp dụng cho câu lệnh tìm kiếm trong ví dụ trên, máy chủ Sk theo dõi mỗi khóa liên quan với tập tin có ak = v. Nếu L(ak, v) là tập các khóa trả về từ máy chủ F(ak, v) thì truy vấn có thể viết dưới dạng biểu thức logic (F(a1, v1) ˄ F(a2, v2)) ˅ F(a3, v3), nghĩa là có thể được máy khách xử lý (L(a1, v1) Ո L(a2, v2)) Ս L(a3, v3).

Giải pháp trên có ưu điểm khá đơn giản nhưng nó lại tiềm ẩn ba yếu điểm cơ bản. Thứ nhất chi phí về truyền thông có thể rất cao, bất kỳ truy vấn nào liên quan đến k thuộc tính thì phải liên hệ với k máy chủ chỉ mục. Nhược điểm thứ hai là tập kết quả trả về cho máy khách có thể rất lớn, thực tế tập khóa trả về cho thuộc tính C=vn có thể lên tới hàng triệu bản ghi. Nhược điểm thưa ba là nó không hỗ trợ cho việc tìm kiếm theo phạm vi, giả sử có thêm thuộc tính không xác định SumWorkers, khó có thể thực hiện truy vấn những đơn vị có số nhân viên trong khoảng từ 1000 đến 2000.

Một cách tiếp cận khác để cài đặt hệ thống đặt tên dựa trên thuộc tính theo cách không tập trung là sử dụng phương pháp đường cong lấp đầy không gian. Ý tưởng cơ bản là lập bản đồ không gian N chiều bao phủ bởi N thuộc tính {a1,a2,..,aN} cho mỗi chiều, sau đó sử dụng kỹ thuật băm để phân phối không gian kết quả giữa các máy chủ chỉ mục, điều quan trọng ở đây là phải có các cặp (thuộc tính, giá trị) gần với nhau để xử lý trên cùng một máy chủ.

Ví dụ xem xét đường cong lấp đầy không gian Hilbert, điều này dễ giải thích bằng không gian hai chiều tượng trưng cho hai thuộc tính, mỗi thuộc tính tương ứng với một trục của không gian. Giả sử mỗi thuộc tính chỉ nhận các giá trị trong khoảng [0,1], đầu tiên chia không gian thành bốn phần tương ứng với bốn chỉ số. Tất cả các dữ liệu (x, y) với 0  x, y < 0,5 liên kết với chỉ số 0, các dữ liệu (x, y) với 0.5 x, y < 1.0 liên kết với chỉ số 2. Có thể lặp lại qui trình này theo phương pháp đệ qui cho mỗi phần con và nối các phần bằng một đường duy nhất, đường cong Hilbert bậc k sẽ nối 22k ô tương ứng với 22k chỉ mục.

Tính chất quan trọng của đường cong lấp đầy không gian là chúng bảo toàn tính cục bộ, hai chỉ mục gần nhau trên đương cong tương ứng với hai điểm cũng gần nhau trong không gian đa chiều, điều ngược lại chưa chắc đã đúng. Các giá trị của thuộc tính cần phải được lập chỉ mục, giả sử có N thuộc tính {a1,a2,..,aN} và mỗi thực thể gán một giá trị cho từng thuộc tính, để đơn giản chúng ta coi các giá trị này đã được chuẩn hóa nằm trong khoảng [0, 1]. Như vậy mỗi thực thể E sẽ có bộ giá trị {v1,v2,..,vN} được liên kết với một tọa đọ có giá trị thực trong không gian N chiều, kết quả là nó được liên kết duy nhất với một ô con trong N chiều. Tâm của ô con đó tương ứng với chỉ mục trên đường cong lấp đầy không gian và giờ đây nó liên kết với thực thể E. Tất nhiên nhiều thực thể có tọa độ rơi vào cùng một ô sẽ có cùng chỉ mục, để tránh xung đột này thì sử dụng bậc cao hơn, bậc 32 hay 64 không phải là hiếm.

Nguyên lý tìm kiếm các thực thể dựa trên các giá trị thuộc tính cũng đã rõ ràng, giả sử các giá trị thuộc tính a1, a2 nằm trong khoảng [v1l,v1u] và [v2l,v2u] với vil<viu , các tọa độ đó phân định các ô mà đường cong đi qua, tất cả các tập tin được đánh chỉ mục bởi những đoạn đường cong giao với các ô đó phù hợp với tiêu chí tìm kiếm. Do đó cần phải có thao tác trả về dãy các chỉ mục liên quan đến đường cong cho một vùng trong không gian N chiều có liên quan, thao tác như vậy phụ thuộc vào đường cong lấp đầy không gian nào đã được sử dụng mà không phụ thuộc vào các thực thể. Cuối cùng là việc tham chiếu đến các thực thể liên quan tới các chỉ mục, một trong những giải pháp lựa chọn là sử dụng giải thuật Chord.

 

 


CHƯƠNG 4:                   ĐỒNG BỘ VÀ CÁC GIẢI THUẬT PHÂN TÁN

Trao đổi thông tin giữa các tiến trình là nhiệm vụ quan trọng trong các hệ thống phân tán, tuy nhiên nhiệm đó chưa phải là tất cả, vấn đề đặt ra là làm thế nào để các tiến trình có thể phối hợp và đồng bộ với nhau. Ví dụ vấn đề sử dụng chung tài nguyên vật lý, các tiến trình không thể đồng thời truy nhập mà mỗi tiến trình sẽ được cấp phép chiếm giữ tạm thời trong một khoảng thời gian nhất định đối với tài nguyên vật lý đó, như vậy đòi hỏi phải có các thuật toán phân phối quyền sử dụng tài nguyên trong hệ thống. Một ví dụ khác đó là một tiến trình nhận được thông điệp được gửi từ nhiều tiến trình khác, vậy cần phải quyết định ưu tiên thông điệp nào được xử lý trước. Đồng bộ và phối hợp là hai việc liên quan mật thiết với nhau, trong khi đồng bộ tiến trình đòi hỏi một tiến trình phải chờ tiến trình khác hoàn thành công việc của mình thì đồng bộ dữ liệu lại chú trọng đến tính nhất quán giữa các bản sao.

Nói về sự phối hợp, mục tiêu của nó là phải quản lý được các tương tác và phụ thuộc lẫn nhau giữa các hoạt động trong hệ thống phân tán, từ đó có thể thấy đồng bộ chỉ là một phần của phối hợp hoạt động. Đồng bộ trong hệ thống phân tán phức tạp hơn rất nhiều so với các hệ thống xử lý trên một máy tính, nhất là đối với các ứng dụng yêu cầu xử lý theo thời gian thực. Mỗi thành viên trong hệ thống phân tán sử dụng đồng hồ vật lý riêng, không có gì đảm bảo rằng tại một thời điểm đồng hồ vật lý của tất cả các thành viên trong hệ thống đều có giá trị giống nhau. Chương này sẽ giới thiệu các giải thuật cơ bản phục vụ cho việc phối hợp các tiến trình cho hệ thống phân tán, trước hết là các giải thuật đồng bộ thời gian, sau đó sẽ đề cập tới các giải thuật loại trừ tương hỗ phân tán và các giải thuật bầu chọn.

4.1       Đồng bộ đồng hồ vật lý

Thời gian trên một máy tính thể hiện rất rõ ràng vì nó chỉ sử dụng duy nhất một đồng hồ vật lý, một tiến trình khi cần biết thời gian chỉ cần thực hiện lời gọi và bộ đếm thời gian cài đặt trong phần lõi của hệ thống sẽ trả lời. Nếu hai tiến trình yêu cầu thời gian hệ thống thì giá trị thời gian của tiến trình gọi trước bao giờ cũng nhỏ hơn giá trị thời gian của tiến trình gọi sau. Trong các hệ thống phân tán, để đạt được sự đồng thuận về thời gian giữa các thành viên là một vấn đề không đơn giản, chúng ta sẽ xem xét trường hợp biên dịch tập tin của dự án phát triển phần mềm trong môi trường phân tán. 

Hình 4.1 Hai máy tính có thời gian khác nhau

 

Để hiểu về nhu cầu đồng bộ thời gian giữa các thành phần trong hệ thống phân tán, chúng ta hãy xem xét trường hợp truy nhập tập tin trên hình 4.1, máy tính thứ nhất có thời gian nhanh hơn máy tính thứ hai và cả hai máy tính này đều không sử dụng đồng hồ toàn cục. Lập trình viên cùng biên soạn tập tin output.c sau đó sẽ biên dịch để được tập tin output.obj. Phần mềm biên dịch thực hiện theo nguyên tắc, trước hết nó kiểm tra tất cả các tập tin nguồn, nếu thời gian tập tin mã nguồn nhỏ hơn thời gian tập tin .obj tương ứng đã được biên dịch gần nhất thì tập tin mã nguồn đó sẽ không được biên dịch.

Tại thời điểm máy tính thứ nhất biên dịch, đồng hồ là 2144, trong khi đó đồng hồ trên máy tính thứ hai là 2142, như vậy tập tin output.obj sẽ ghi nhận thời gian được biên dịch là 2144. Sau một đơn vị thời gian, lập trình viên trên máy tính thứ hai thực hiện biên dịch, chương trình dịch sẽ kiểm tra thời gian cuối cùng biên dịch tập tin output.obj là 2044 cao hơn thời gian hiện  hành 2143 máy tính thứ hai, do đó nó không thực hiện biên dịch mặc dù tập tin output.c đã được chỉnh sửa. Như vậy đã xảy ra vấn đề ghi nhận thời gian cập nhật gần nhất đối với tập tin output.c  và lập trình viên trên máy tính thứ hai khó có thể xác định nguyên nhân lỗi trong trường hợp này. Từ ví dụ trên có thể thấy vai trò quan trọng của thời gian trong các hệ thống phân tán, lỗi trên có thể sẽ không xảy ra nếu như tập tin output.c được gán nhãn thời gian của một đồng hồ vật lý chung của toàn hệ thống. Vậy câu hỏi đặt ra là có một cơ chế nào để đồng bộ tất cả các đồng hồ trong hệ thống phân tán hay không, câu trả lời tưởng chừng đơn giản nhưng thực tế lại khá phức tạp.

Thời gian đóng vai trò rất quan trọng trong các hệ thống thông tin, nếu trên một máy tính thì giá trị thời gian đọc sau không bao giờ nhỏ hơn lần đọc trước. Hầu hết các máy tính đều có một vi mạch để duy trì thời gian, ngôn ngữ phổ thông gọi là đồng hồ nhưng chính xác hơn phải gọi là bộ đếm thời gian máy tính. Bộ đếm thời gian trong máy tính là một bộ dao động tinh thể thạch anh, tần suất dao động của nó phụ thuộc vào loại tinh thể và hiệu điện thế cài đặt trong vi mạch. Trong vi mạch này có hai thanh ghi, một thanh ghi dùng làm bộ đếm và một thanh ghi dùng để lưu trữ, sau mỗi dao động của tinh thể bộ đếm sẽ giảm 1 đơn vị, khi đạt giá trị 0 sẽ sinh ra một ngắt thời gian sau đó được nạp lại giá trị lấy từ thanh ghi lưu trữ. Mặc dù tần số của bộ dao động tinh thể thạch anh khá ổn định, nó không thể đảm bảo các tinh thể trong các máy tính khác nhau đều chạy chính xác cùng tần số.

Mỗi thành viên của hệ thống phân tán lại có đồng hồ đo thời gian riêng, sự tồn tại nhiều đồng hồ vật lý như vậy sẽ phát sinh vấn đề đồng bộ với thời gian thực và thời gian giữa các thành viên với nhau. Thực tế khi một hệ thống có nhiều máy tính thì tất cả các tinh thể sẽ chạy với tần số khác nhau chút ít, dần gây ra sự mất đồng bộ và giá trị đọc ra sẽ khác nhau. Sự khác nhau về giá trị thời gian được gọi là sự sai lệch của đồng hồ và kết quả sẽ dẫn đến những sai lệch trong những tính toán có liên quan tới thời gian thực. Đồng hồ vật lý của các thiết bị cần phải được đồng bộ với thời gian chuẩn, nếu các máy tính có các bộ thu thời gian và có thể liên lạc được máy chủ thời gian quốc tế thì việc nên thực hiện đồng bộ theo thời gian quốc tế, nếu không thể liên lạc được thì sử dụng các biện pháp tốt nhất có thể để đảm bảo sai lệch thời gian giữa các thành viên thấp nhất.

Bốn giải thuật phổ biến đang sử dụng hiện nay là: giải thuật Cristian, giải thuật Berkeley, giải thuật trung bình và giải thuật tham chiếu quảng bá. Tất cả các giải thuật đều sử dụng nguyên lý cơ bản, mỗi máy xem như có một bộ đếm thời gian, nó tạo ra một ngắt H lần trong một giây. Gọi giá trị của đồng hồ này là C. Khi thời gian UTC là t, thì giá trị của đồng hồ trên máy p sẽ là Cp(t). Trong một thế giới lí tưởng chúng ta có Cp(t) = t cho tất cả p và t, nói cách khác C(p)t lí tưởng bằng 1. Bộ định thời thực không ngắt chính xác H lần trong một giây. Về lý thuyết, bộ định thời với H = 60 cần phát ra 216000 nhịp trong một giờ. Thực tế những sai số tương đối đạt được với các vi mạch đếm thời gian hiện đại đạt khoảng 10-5, nghĩa là một máy nào đó có thể lấy giá trị từ 215998 đến 216002 nhịp trong một giờ. Một cách chính xác hơn, tồn tại một hằng số ρ thoả mãn 1 - ρ ≤ dC.dt ≤ 1 + ρ, hằng số ρ sẽ được nhà sản xuất công bố và được gọi là tỉ lệ dung sai tối đa.  

4.1.1    Giải thuật Cristian

Giải thuật này do Cristian đề xuất vào năm 1989 và đã được áp dụng cho đồng bộ thời gian máy khách với máy chủ thời gian quốc tế bằng cách sử dụng  giao thức đồng bộ thời gian mạng (NTP). Khi máy khách gửi yêu cầu lên máy chủ để lấy thời gian, thời gian trễ trên đường truyền sẽ làm sai lệch giá trị thời gian thực, bí quyết của giải thuật chính là cách tính toán cho sự chậm trễ này. Giao thức thời gian mạng NTP (Network Time Protocol) dùng để đồng bộ đồng hồ của các hệ thống máy tính thông qua mạng dữ liệu chuyển mạch gói với độ trễ thay đổi. Mỗi máy được cài đặt bộ phận nhận thời gian từ máy chủ trên mạng, nó giải quyết  vấn đề trễ thông tin lưu chuyển trên mạng bằng cách tính toán tương đối độ lệch thời gian theo giải thuật Cristian và độ chính xác có thể đạt  dưới 50 ms.

Hình 4.2 Giải thuật Cristian

Sử dụng giao thức NTP, tại thời điểm T1 máy khách gửi A yêu cầu và nhận được kết quả trả về từ máy chủ B tại thời điểm T4. Thời gian máy chủ nhận được là T2 và thời gian trả về kết quả là T3. Giả thiết độ trễ mạng chiều gửi và chiều nhận xấp xỉ bằng nhau, nghĩa là T2 - T1 ≈ T4 - T3, máy khách có thể ước tính độ lệch thời gian với máy chủ là Ɵ = T3+ (T2 - T1 +T4 - T3)/2 - T4 = (T2-T1+T3-T4)/2, thời gian mới của máy khách sẽ phải cộng thêm giá trị tính toán theo công thức trên. Nếu giá trị  Ɵ < 0, nghĩa là đồng hồ của máy khách chạy nhanh hơn thì cần phải điều chỉnh lùi, nhưng thời gian không thể quay lui, hành động này có thể dẫn đến những hậu quả nghiêm trọng. Nếu trong khoảng thời gian quay lui đến thời điểm hiện hành không có sự kiện cập nhật nào thì có thể thiết lập thời gian mới, nhưng nếu có sự kiện đã xảy ra thì nên tạo vòng lặp để điều chỉnh dần dần. Chu kỳ điều chỉnh thường 10ms, nghĩa là cứ 10ms trôi qua thì điều chỉnh thành 9ms cho đến khi đạt được độ chính xác. Tương tự như vậy đối với trường hợp Ɵ > 0, nghĩa là đồng hồ của máy khách chạy chậm hơn, do đó phải điều chỉnh tiến nhưng cần kiểm tra xem trong khoảng thời gian đó có nhiệm vụ theo lịch hay không, nếu có thì phải tránh hiện tượng bỏ sót, nghĩa là cứ 10 ms trôi qua thì điều chỉnh thành 11ms cho đến khi đạt được độ chính xác.

Khi giao thức NTP đã được thiết lập giữa các máy, B cũng thăm dò A cho thời gian hiện tại của nó, độ trễ truyền thông ước chừng sẽ bằng δ = ((T4-T1) – (T3-T2))/2. Để chính xác hơn thì cần thực hiện tám lần, tám cặp giá trị (Ɵ, δ) được lưu vào bộ đệm, cuối cùng lấy giá trị tối thiểu cho δ làm độ trễ ước lượng tốt nhất và sau đó giá trị Ɵ tương tứng là độ lệch thời gian đáng tin cậy nhất. Các máy chủ thời gian NTP cũng cần phải được đồng bộ, về nguyên tắc thì có thể áp dụng NTP đối xứng, nghĩa là máy B cũng có thể phải đồng bộ theo máy A, nhưng điều này sẽ gây ra sự hỗn loạn. Để giải quyết vấn đề này, các máy chủ NTP được chia thành các tầng, những máy chủ tham chiếu đến đồng hồ nguyên tử được xếp vào tầng 1, nó chỉ điều chỉnh đồng hồ khi mức tầng của nó cao hơn máy chủ tham chiếu.  

4.1.2    Giải thuật Berkeley

Giải thuật Cristian đòi hỏi phải có một máy chủ cung cấp thời gian cho các thành viên trong hệ thống, thời gian của mỗi thành viên sẽ hoàn toàn phụ thuộc vào máy chủ này, như vậy có thể nói máy chủ thời gian hoàn toàn thụ động trong quá trình đồng bộ. Cách tiếp cận của giải thuật Berkeley hoàn toàn ngược lại, một tiến trình trên máy chủ luôn thăm dò các để tính toán thời gian thời gian cần phải điều chỉnh cho tất cả các thành viên trong nhóm. Giải thuật Berkeley thực hiện tính toán thời bằng cách tham khảo thời gian của tất cả các thành viên trong hệ thống, máy chủ thời gian chỉ đóng vai trò như một thành viên điều phối, vì vậy giải thuật này thích hợp cho hệ thống không có khả năng đồng bộ với các máy chủ thời gian quốc tế.

Hình 4.3 Giải thuật Berkeley

Máy chủ gửi thời gian của mình cho các thành viên và yêu cầu từng thành viên trả về độ lệch thời gian giữa thành viên với máy chủ. Sau khi nhận được kết quả từ các thành viên, máy chủ tính trung bình của các giá trị trả về và coi đó là thời gian cần điều chỉnh, máy chủ tính toán độ lệch thời gian cho mỗi thành viên và gửi yêu cầu để các thành viên cập nhật lại thời gian. Thời gian ban đầu trên máy chủ có thể được điều chỉnh thủ công, thời gian sau khi đồng bộ có thể khác với thời gian quốc tế, nhưng tất cả các thành viên cùng đồng thuận với sự sai lệch này, như vậy giải thuật chỉ được áp dụng trong nội bộ.

4.1.3    Giải thuật trung bình

Các thành viên trong hệ thống thống nhất chu kỳ tái đồng bộ thời gian, khoảng thời gian thứ i sẽ bắt đầu từ thời điểm T0 + iR và chạy đến khi T0 + (i+1)R, trong đó T0 là thời điểm xác định trước và R là một biến hệ thống. Bắt đầu mỗi chu kỳ, tất các các thành viên quảng bá thời gian của mình, sau đó bắt đầu nhận các bản tin quảng bá từ các thành viên khác trong khoảng thởi gian S. Cách đơn giản nhất để tính thời gian mới là lấy trung bình của tất cả các giá trị nhận được, hoặc có thể loại bỏ m giá trị cao nhất và thấp nhất và lấy thời gian trung bình của phần còn lại. Để chính xác hơn có thể cộng thêm độ trễ thời gian di chuyển trên mạng cho mỗi bản tin, độ trễ này có thể ước lượng bằng cách gửi thông điệp và đo thời gian phản hồi.

4.1.4    Giải thuật tham chiếu quảng bá

Trong các mạng có dây, có thể dễ dàng cài đặt các máy chủ thời gian và thực hiện truyền thông giữa các máy, do đó việc truyền tải thông tin có thể thực hiện tương đối dễ dàng. Mạng không dây, đặc biệt là những mạng cảm biến, sẽ không còn giữ được các ưu điểm trên, mỗi nút là tài nguyên bị ràng buộc và việc định tuyến qua nhiều điểm truy nhập không dây dẫn tới chi phí cao, ngoài ra cần phải tối ưu hóa giải thuật để tiết kiệm năng lượng. Từ những vấn đề trên, cần thiết phải thiết kế các giải thuật đồng bộ khác cho các mạng không dây.

Đồng bộ tham chiếu quảng bá là giao thức đồng bộ thời gian cho các thành viên của hệ thống phân tán trong mạng không dây, nguyên lý vận hành khác hẳn với các giao thức đồng bộ trong mạng có dây. Thứ nhất, nó không giả thiết tính sàng của mỗi nút và cũng giống như giải thuật Berkeley nó không hướng tới mục tiêu đồng bộ theo thời gian quốc tế UTC mà chỉ đồng bộ theo thời gian của các thành viên nội bộ trong hệ thống. Thứ hai, các giải thuật trước đây đều sử dụng giao thức trao đổi thông tin hai chiều để đồng bộ, nghĩa là bên gửi và bên nhận đều tham gia vào quá trình đồng bộ, giải thuật đồng bộ tham chiếu quảng bá tách khỏi quan điểm này, nó loại bỏ thành viên gửi và chỉ cho phép đồng bộ các thành viên nhận.

Hình 4.4 Cách tính thời gian trễ

Trong tham đồng bộ tham chiếu quảng bá, bên gửi quảng bá thông điệp tham chiếu với mong muốn những thành viên nhận được sẽ tự điều chỉnh đồng hồ của mình. Điểm quan trọng là ở chỗ trong mạng cảm biến, với giả thiết không cần định tuyến qua nhiều điểm truy nhập thì thời gian lan tỏa tín hiệu đến các nút khác xấp xỉ là hằng số. Độ trễ lưu chuyển thông tin trong mạng không dây phụ thuộc nhiều yếu tố, thông tin phải di chuyển qua bộ định tuyến không dây với tốc độ không ổn định và  phụ thuộc nguồn năng lượng cũng như khoảng cách vật lý. Các thành viên sẽ không lường trước được thời gian chờ để được phục vụ và vì vậy một giải pháp được đưa ra là loại bỏ thời gian trễ chuẩn bị bản tin và thời gian chờ đợi trên Card mạng. Thời gian lan truyền trong trường hợp này được tính từ thời điểm thông điệp rời khỏi card mạng của bên gửi, như vậy hai nguyên nhân quan trọng làm thay đổi thời gian truyền thông điệp không còn đóng vai trò trong ước lượng trễ, đó là thời gian chi phí cho xây dựng thông điệp và thời gian chi phí cho việc truy nhập mạng.

Các giao thức đồng bộ thời gian ví dụ như NTP, nhãn thời gian được thêm vào thông điệp trước khi chuyển đến card mạng. Hơn nữa, mạng không dây dựa trên giao thức tương tranh và không thể biết trước được thông điệp sẽ phải chờ bao lâu để được thực sự gửi đi, những yếu tố không tự quyết sẽ bị loại bỏ trong đồng bộ tham chiếu quảng bá, vấn đề còn lại chỉ là thời gian phân phát đến máy nhận nhưng nó nhỏ hơn đáng kể so với thời gian truy nhập mạng. Ý tưởng đồng bộ tham chiếu quảng bá rất đơn giản, khi một nút quảng bá thông điệp tham chiếu m, mỗi nút P nhận được thông điệp m sẽ ghi nhận thời gian Tp,m, đó là thời gian cục bộ của P. Bỏ qua độ lệch thời gian, hai nút P và Q có thể trao đổi với nhau thời gian phân phát để ước lượng độ lệch tương đối với nhau:

trong đó M là tổng số thông điệp tham chiếu đã gửi. Thông tin này quan trọng, nút P sẽ biết giá trị đồng hồ của Q tương ứng với giá trị của nó. Ngoài ra, nếu chỉ đơn giản lưu trữ các độ lệch này thì không cần điều chỉnh đồng hồ của mình, đáng tiếc các đồng hồ có thể trôi dạt khác nhau, kết quả là việc tính toán đơn giản đổ lệch trung bình như đã thực hiện trên không còn phù hợp nữa, các giá trị cuối cùng được gửi đơn giản sẽ kém chính các hơn các giá trị đầu tiên. Hơn nữa, cùng với thời gian qua đi, độ lệch cũng sẽ tăng lên. Elson đã sử dụng giải thuật đơn giản để cân bằng điều này, thay vì việc tính toán trung bình thì áp dụng hồi quy tuyến tính tiêu chuẩn để tính độ lệch Offset[p,q](t)=αt+β, trong đó các hằng số αβ được tính từ cặp (Tp,k, Tq,k), công thức mới sẽ cho phép nút P tính toán chính xác hơn nhiều đồng hồ hiện hành của Q và ngược lại. Các máy tính trong mạng không dây liên lạc với nhau theo hình thức quảng bá, vì vậy việc sử dụng giải thuật trung bình sẽ là giải pháp thích hợp hơn trong môi trường này.

4.2       Thời gian và đồng hồ logic

Cho đến nay, chúng ta đã giả thiết việc đồng bộ hóa đồng hồ liên quan một cách tự nhiên với thời gian thực, trong nhiều trường hợp các tiến trình có thể đồng thuận về thời điểm hiện tại mà không cần phải sử dụng thời gian thực. Ví dụ khi biên dịch tập tin, các bên chỉ cần nhận biết tập tin input.obj đã lỗi thời và tập tin input.c là phiên bản mới. Điều quan trọng trong trường hợp này là phải có cơ chế theo dõi các sự kiện của nhau, chỉ cần xác định sự kiện nào xảy ra trước mà không cần quan tâm đến thời gian vật lý. Nếu hai tiến trình không tương tác với nhau thì có đồng bộ thời gian hay không cũng không ảnh hưởng đến hoạt động của chúng, hơn nữa dù cho sử dụng thuật toán nào thì vẫn có sự khác biệt thời gian vật lý giữa các tiến trình. Lamport là người đầu tiên đã đưa ra khái niệm đồng hồ logic, đó là cơ chế ghi nhận các sự kiện xảy ra và các tiến trình chỉ cần quan tâm đến thứ tự của các sự kiện đó.

4.2.1    Đồng hồ Lamport

Để đồng bộ đồng hồ logic, Lamport dựa trên quan điểm nhân quả và đưa ra định nghĩa mối quan hệ gọi được gọi là xảy ra trước. Sự kiện a xảy ra trước sự kiện b, ký hiệu là  a→b, được gọi là đúng nếu:

-         Nếu a và b là hai sự kiện xảy ra trong cùng một tiến trình và a xảy ra trước b.

-         Nếu a và b không thuộc cùng một tiến trình nhưng a là sự kiện gửi một thông điệp đi và b là sự kiện nhận thông điệp đó.

Quan hệ xảy ra trước có tính chất bắc cầu, nếu a→b và b→c thì ta sẽ có a→c. Nếu hai sự kiện x và y xảy ra trong hai tiến trình khác nhau mà không xác định được mối tương quan giữa chúng thì không thể nói x→y hay y→x, trường hợp này ta nói x và y là những sự kiện tương tranh vì chúng hoàn toàn có thể xảy ra đồng thời với nhau. Ký hiệu C(x) là nhãn thời gian của x, những mệnh đề sau là đúng:

-         Trong cùng một tiến trình, nếu a xảy ra trước b thì C(a) < C(b).

-         Nếu a và b biểu diễn sự kiện gửi và nhận cùng một thông điệp thì C(a) < C(b), sự kiện nhận phải xảy ra sau sự kiện gửi vì cần một khoảng thời gian nhất định để lưu chuyển trên mạng.

-         Mọi sự kiện phân biệt a và b thì C(a) ≠ C(b).

Để đo thời gian tương ứng với một sự kiện thì ta gán một giá trị cho bộ đếm C cho sự kiện đó, các giá trị này phải đảm bảo nếu a→b thì C(a) < C(b). Bộ đếm C chỉ có thể tiến chứ không được lùi, nghĩa là nếu cần điều chỉnh thì chỉ được phép cộng thêm giá trị số dương.

Hình 4.5 Đồng bộ nhãn thời gian Lamport

Giả sử có ba tiến trình P1, P2 và P3, mỗi tiến trình đều có bộ đếm thời gian riêng nhưng nhịp đếm không giống nhau, ban đầu giá trị đồng hồ trên mỗi tiến trình đều bằng 0. Cùng khoảng thời gian vật lý, tiến tình P1 chỉ đếm được 6 nhịp trong khi đó tiến trình P2 đếm được 8 nhịp và tiến trình P3 đếm được 10 nhịp. Tại nhãn 6, tiến trình P1gửi thông điệp m1 cho tiến trình P2, mất bao lâu để thông điệp này đến đích tùy thuộc vào việc lựa chọn đồng hồ nào, cụ thể trường hợp này P2 ghi nhận tại nhãn 16 và nó hiểu rằng thời gian di chuyển thông điệp hết 10 đơn vị. Tương tự như vậy, thời gian di chuyển của thông điệp m2 là 16 đơn vị, cả hai giá trị này đều là những số dương cho nên có thể chấp nhận được.

Xét thông điệp m3, thời điểm rời khỏi tiến trình P3 là 60 và đến đích là 56, như vậy tiến tình P2 nhận thấy thời gian lưu chuyển là -4, đây là giá trị không thể chấp nhận được và cần phải có biện pháp ngăn chặn hiện tượng này. Giải pháp của Lamport suy luận trực tiếp từ quan hệ xảy ra trước, vì m3 rời đi tại thời điểm 60 thì thời điểm đến nhanh nhất phải là 61. Nếu giá trị nhãn thời gian tại điểm nhận nhỏ hơn hoặc bằng nhãn thời gian bên gửi thì bên nhận sẽ cộng thêm một đơn vị vào nhãn thời gian gửi, như vậy tiến trình P2 phải điều chỉnh từ 56 thành 61. Sau 8 đơn vị thời gian, thông điệp m4 rời khỏi P2, như vậy thời điểm gửi đi sẽ là 69 và đến đích tại thời điểm 54, do đó P1 sẽ phải điều chỉnh đồng hồ thành giá trị 70.

Trong phần mở đầu chúng ta đã nói về vai trò của tầng trung gian, tất cả những thao tác đồng bộ đồng hồ logic đều được thực hiện ở tầng này. Giải thuật gán nhãn thời gian Lamport sẽ được thực hiện như sau:

1.      Mỗi tiến trình Pi có bộ đếm Ci để đánh dấu thời điểm xảy tra các sự kiện trong tiến trình, sự kiện ở đây có thể là nội tại trong tiến trình hoặc gửi thông điệp cho tiến trình khác.

2.      Trước khi thực hiện một sự kiện, tiến trình Pi  tăng bộ đếm thêm 1 đơn vị, nghĩa là  Ci ← Ci + 1.

3.      Khi tiến trình Pi gửi thông điệp m cho tiến trình  Pj, nó gửi kèm nhãn thời gian của thông điệp ts (m) =Ci .

4.      Nhận được thông điệp m, tiến trình Pj điều chỉnh bộ đếm Cj ← max{Cj , ts (m)}, sau đó mới chuyển lên tầng ứng dụng.

Trong một số trường hợp, cần phải bổ sung thêm định danh của tiến trình để đảm bảo không xảy ra hiện tượng hai sự kiện có nhãn thời gian giống nhau. Ký hiệu  (Ci, i)  sẽ được hiểu là sự kiện xảy ra tại thời điểm Ci trên tiến trình  Pi. Cho hai nhãn thời gian (Ci, i) và (Cj, j), nếu Ci = Cj và i<j thì (Ci, i) < (Cj, j).

Nhãn thời gian Lamport được áp dụng cho truyền thông hàng đợi, ví dụ về trường hợp cập nhật dữ liệu nhân bản, thứ tự cập nhật các bản sao phải được thực hiện rất nghiêm ngặt. Giả sử tài khoản của khách hàng có 1000 đồng, tại một thời điểm khách hàng gửi thêm 100 đồng và ngân hàng cũng tính lãi suất 1% cho tài khoản này, hai lệnh trên được gửi đến các bản sao nhân bản để cập nhật. Do độ trễ trên mạng nên hai lệnh cập nhật đến các bản sao theo thứ tự khác nhau, lệnh gửi thêm tiền được thực hiện trước trên bản sao thứ nhất thì số dư tài khoản sẽ là 1111 VND, còn trên bản sao thứ hai lệnh tính lãi suất được thực hiện trước thì số dư tài khoản của sẽ là 1110 VND. Vấn đề ở đây là các thao tác cập nhật phải được thực hiện theo cùng một thứ tự trên tất cả các bản sao thì mới có thể đạt được tính nhất quán, dù cho giá trị có thể khác nhau phụ thuộc vào việc lệnh nào được thực hiện trước. Những trường hợp như vậy đòi hỏi phải đảm bảo truyền thông theo nhóm có thứ tự, cách đơn giản là gán nhãn thời gian Lamport cho mỗi câu lệnh cập nhật trước khi gửi đến các bản sao, tầng trung gian trên mỗi bản sao có nhiệm vụ sắp xếp lại theo thứ tự đã phân phát trước khi gửi cho ứng dụng xử lý.

Qui trình truyền thông nhóm theo thứ tự toàn bộ được thực hiện bằng cách mỗi thông điệp được gán nhãn thời gian Lamport của bên gửi, giả sử không bị mất thông điệp nào. Tiến trình nhận sẽ đưa các thông điệp vào hàng đợi cục bộ và sắp xếp theo nhãn thời gian đính kèm sau đó sẽ gửi thông điệp xác nhận đến tất cả các tiến trình khác, tất nhiên thông điêp xác nhận cũng được gán nhãn thời gian Lamport và giá trị của nó luôn lớn hơn nhãn thời gian trong thông điệp nhận được, như vậy tất cả các tiến trình cuối cùng sẽ có cùng một bản sao của hàng đợi cục bộ. Tiến trình nhận có thể gửi thông điệp ở đầu hàng đợi đến ứng dụng xử lý khi và chỉ khi nó đã được tất cả các tiến trình khác xác nhận, sau khi chuyển qua ứng dụng thì có thể xóa thông điệp đó khỏi hàng đợi, như vậy đã đạt được tính nhất quán theo thứ tự. Truyền thông nhóm theo thứ tự toàn bộ là giải pháp quan trọng cho các dịch vụ nhân bản, các bản sao đạt được tính nhất quán bằng cách thực hiện các thao tác giống nhau theo cùng một thứ tự ở mọi nơi. Các bản sao tuân thủ qui tắc chuyển đổi giống nhau trong cùng một máy trạng thái hữu hạn nên nó còn được gọi là nhân bản máy trạng thái.

4.2.2    Đồng hồ vector

Đồng hồ Lamport mới chỉ đề cập đến kết quả mà chưa nói đến nguyên nhân, nếu sự kiện a xảy ra trước sự kiện b thì nhãn thời gian xảy ra sự kiện a phải nhỏ hơn nhãn thời gian xảy ra sự kiện b, nghĩa là C (a) <C (b). Sẽ chưa thể có kết luận về mối liên hệ giữa hai sự kiện nếu biết nhãn thời gian của chúng, tức là nếu C (a) <C (b) và chúng đều là hai sự kiện trong một tiến trình hoặc của cùng một thông điệp thì có thể khẳng định a→b, ngược lại thì không thể khẳng định sự kiện nào xảy ra trước. Ký hiệu Tsnd(mi)  là nhãn thời gian gửi thông điệp mi Trcv(mi) là nhãn thời gian nhận được thông điệp đó, hiển nhiên ta có  Tsnd(mi)  < Trcv(mi) bởi vì chúng đều là các sự kiện liên quan tới thông điệp mi. Nếu Tsnd(mi)  < Trcv(mj) thì không thể có kết luận gì về tính nhân quả giữa hai thông điệp mi mj, ví dụ trên hình vẽ, không thể khẳng định m0 hay m1 được gửi trước.

Vấn đề nằm ở chỗ đồng hồ Lamport không nắm bắt được quan hệ nhân quả, điều này có thể khắc phục bằng cách sử dụng đồng hồ vector. Trong một số trường hợp, áp dụng đồng hồ vector có thể đưa ra kết luận về tính nhân quả của hai sự kiện trên, do đó người ta nói đồng hồ vector là nhân quả hóa các sự kiện phi nhân quả. Để theo dõi quan hệ nhân quả thì chỉ cần gán cho mỗi sự kiện một tên duy nhất, chẳng hạn tổ hợp định danh tăng tuần tự của các tiến trình, ký hiệu pk là sự kiện thứ k trong tiến trình P. Vấn đề nhân quả sẽ được giải quyết bằng việc theo dõi lịch sử hoạt động, đó là những sự kiện được ghi lại trong bộ nhớ ổn định khi thực hiện các thao tác trên mỗi tiến trình.

Nếu sử dụng một chỉ mục cho mỗi tiến trình thì có thể biểu diễn lịch sử nhân quả dưới dạng vector, số lượng phần tử của vector bằng số lượng tiến trình và mỗi phần tử tương ứng với một tiến trình. Vector nhãn thời gian được xây dựng bằng cách để mỗi tiến trình Pi duy trì một vector Vi với hai tính chất sau:

-         Vi[i] là số sự kiện đã xảy ra cho đến thời điểm hiện tại trên tiến trình Pi.

-         Nếu Vi[j] = k thì Pi hiểu rằng k sự kiện đã xảy ra ở Pi.

Tính chất đầu tiên được duy trì bởi việc tăng Vi[i] đồng thời với mỗi sự kiện mới xảy ra ở Pi, tính chất thứ hai được duy trì bằng các vector nhãn thời gian cùng với các thông điệp được gửi. Mỗi khi có sự kiện mới xảy ra ở tiến trình Pi thì phải tăng VCi[i] và phải đảm bảo vector này được gửi cùng thông điệp suốt trong quá trình. Giải thuật gán nhãn thời gian vector phát biểu như sau:

-         Mỗi tiến trình Pi duy trì n-vector Vi, ban đầu tất cả các phần tử đều bằng 0.

-         Mục j trong Vi là ước chừng số bước thực hiện trong tiến trình Pi

-         Tại mỗi bước, giá trị Vi[i] được tăng thêm 1: Vi [ i ] ← Vi [i]+1.

-         Khi tiến trình Pi gửi thông điệp m cho Pj, nó đặt nhãn thời gian vector ts(m)=Vi [i].

-         Sau khi nhận thông điệp, tiến trình Pj  cập nhật Vj [j ] ← max{Vj [j], ts (m)[j]}

-         Nếu a là sự kiện trong tiến trình  Pi thì gán V(a) là giá trị của Vi tại cuối sự kiện a.

Giá trị  ts(m)[i] biểu thị ts(m)[i]-1 sự kiện đã xảy ra trên tiến trình Pi trước khi gửi thông điệp, như vậy tiến trình Pj biết được số lượng sự kiện xảy ra không những trên tiến trình Pi mà còn cả trên các tiến trình khác. Nói cách khác, nhãn thời gian ts(m) thể hiện số lượng sự kiện trong tất cả các tiến trình xảy ra trước khi gửi thông điệp m và m có thể phụ thuộc vào nhân quả đó.

Hình 4.6 Cập nhật nhãn thời gian vector

Giả sử có ba tiến trình P0, P1 và P2, trong mỗi tiến trình sẽ xây dựng một vector gồm ba phần tử, mỗi phần tử tương ứng với nhãn thời gian của một tiến trình, ban đầu giá trị của tất cả các phần tử đều bằng 0.  Tiến trình P0 gửi thông điệp cho tiến trình P1 tại thời điểm giá trị vector của nó là (1,0,0), nhận được thông điệp tiến trình P1 sẽ cập nhật vector thời gian của nó thành (1,2,0), quá trình tương tự như vậy cũng được thực hiện cho các sự kiện khác của cả ba tiến trình. Nhắc lại kiến thức về so sánh vector, cho hai vector V và W, chỉ có thể so sánh nếu số lượng phần tử của chúng bằng nhau, khi đó các mệnh đề sau là đúng:

         Ngang bằng: V = W nếu với mọi i, V[i] = W[i], ví dụ: (3,2,4) = (3,2,4)

         Nhỏ hơn hoặc bằng: V ≤ W nếu với mọi i, V[i] ≤ W[i], ví dụ: (2,2,3) ≤ (3,2,4), (3,2,4) ≤ (3,2,4)

         Nhỏ hơn: V < W nếu V ≤ W nhưng V ≠ W,      ví dụ: (2,2,3) < (3,2,4)

         Không thể so sánh: V || W  nếu !(V≤ W) và !(W ≤ V), ví dụ: (3,2,4) || (4,1,4)

Sử dụng đồng hồ vector, giờ đây có thể đảm bảo tính nhân quả trong truyền thông, nghĩa là một thông điệp được gửi đi khi và chỉ khi đã nhận được tất cả các thông điệp trước nó, thậm chí đó là những thông điệp được gửi từ bất kỳ tiến trình nào vào bất kỳ thời gian nào. Tầng trung gian trì hoãn việc chuyển thông điệp lên tầng ứng dụng, sẽ lưu giữ thông điệp trong một khoảng thời gian nhất định để sắp xếp chúng theo thứ tự nhân quả.

Ví dụ ba tiến trình P0, P1 và P2 gửi thông điệp theo nhóm, P0 gửi thông điệp đến các thành viên khác, P1 nhận được thông điệp sau đó gửi theo nhóm và thông điệp này đến P2 sớm hơn thông điệp được gửi từ P0. Thời điểm P2 nhận được thông điệp từ P1, nhãn thời gian của nó vẫn là (0,0,0) trong khi nhãn thời gian của thông điệp do P1 gửi đến là ts(m)=(1,2,0), kiểm tra phần tử thứ nhất của nhãn thời gian vector nó hiểu rằng cần phải chờ thông điệp từ P0. Nhận được thông điệp từ P0 với nhãn thời gian ts(m)= (1,0,0) nó điều chỉnh nhãn thời gian (1,0,1) lấy từ vùng đệm thông điệp từ P1 gửi đến để xử lý, nhãn thời gian được gán sẽ là (1,2,2). Phần mềm trung gian sắp xếp các thông điệp theo thứ tự nhân quả chỉ dựa thuần tùy vào nhãn thời gian đính kèm, cách tiếp cận này có một số hạn chế nhất định dẫn đến các vấn đề về hiệu năng.

4.2.3    Trạng thái toàn cục

Tại một thời điểm bất kỳ, trạng thái toàn cục của một hệ thống phân tán được đặc trưng bởi trạng thái của từng tiến trình và các thông điệp đang lưu chuyển trong hệ thống. Một trong những phương pháp để xác định trạng thái toàn cục là sử dụng lát cắt, lát cắt mô tả sự kiện cuối cùng mà sự kiện này được ghi lại cho mỗi tiến trình, bằng cách này nó có thể kiểm tra lại rằng tất cả các thông điệp nhận đều tương ứng với các thông điệp gửi được ghi lại trên đường cắt.

Nếu có đồng hồ được đồng bộ tuyệt đối, một giải pháp được đưa ra là mỗi tiến trình pi  ghi nhận trạng thái xi tại thời điểm tương lai t nào đó sẽ gửi xi(t) đến tất cả các tiến trình khác. Vấn đề nằm ở chỗ giải pháp trên không ghi nhận trạng thái của các kênh truyền và đồng thời bị sai lệch bởi trễ đường truyền, do đó đồng bộ tuyệt đối là không thể được. Vì vậy cần phải nới lỏng điều kiện, thay cho khái niệm trạng thái toàn cục của hệ thống sẽ đưa ra trạng thái toàn cục nhất quán.

 

Hình 4.7 Lát cắt trong hệ thống phân tán

Cho tiến trình Pi , trong đó xuất hiện các sự kiện ei0, ei1, … ta có một số khái niệm sau:

         Lịch sử tiến trình (Pi) =  hi = <ei0, ei1, … >

         Tiền sử tiến trình (Pik) =  hik = <ei0, ei1, …,eik >

         Trạng thái tiến trình Sik : là trạng thái của Pi  ngay trước khi sự kiện thứ k.

Hình 4.8 Các loại lát cắt

 

            Lát cắt mô tả sự kiện cuối cùng mà sự kiện này được ghi lại cho mỗi tiến trình. Cho tập các tiến trình P1 , …,Pi , …. :

         Lịch sử toàn cục: H = Èi (hi)

         Trạng thái toàn cục: S = Èi (Siki)

         Lát cắt C Í H = h1c1 È h2c2 ÈÈ hncn

Ranh giới của C = {eici, i = 1,2, … n}

            Lát cắt C  là nhất quán khi và chỉ khi  với "e Î C, nếu tồn tại quan hệ nhân quả f ® e thì f Î C. Lát cắt là nhất quán mạnh khi và chỉ khi mọi quan hệ nhân quả f ® e ta có f ,e Î C,  nghĩa là sự kiện gửi và nhận đều thuộc về lát cắt. Các trường hợp khác gọi là lát cắt không nhất quán, trạng thái toàn cục S là nhất quán khi và chỉ khi nó tương ứng với lát cắt nhất quán.

4.3       Các giải thuật loại trừ tương hỗ phân tán

Một trong những vấn đề cơ bản của các hệ thống phân tán là sự tương tranh và sự phối hợp giữa các tiến trình. Có thể xảy ra trường hợp cùng một lúc nhiều tiến trình cùng truy nhập đến một tài nguyên dẫn đến sự xung đột hoặc một thao tác nào đó không được thực thi trọn vẹn. Để giải quyết vấn đề này, một số giải thuật loại trừ tương hỗ đã được đề xuất dựa trên phương pháp sử dụng thẻ bài và cấp quyền truy nhập.

Bản chất của phương pháp thẻ bài là duy trì một thông điệp duy nhất gọi là thẻ bài di chuyển trong một nhóm các thành viên của hệ thống. Thành viên nào nắm giữ thẻ bài thì có quyền truy nhập tài nguyên, nếu không có nhu cầu  truy nhập tài nguyên thì sẽ chuyển cho thành viên kế tiếp. Phương pháp này luôn bảo đảm tránh được tương tranh vì tại một thời điểm chỉ có tối đa một thành viên nắm giữ thẻ bài, tuy nhiên nếu thẻ bài bị mất thì không có thành viên nào được sử dụng tài nguyên, hệ thống phải tái tạo một thẻ bài mới. Phương pháp cấp quyền truy nhập hoạt động theo hai bước, bước thứ nhất gửi yêu cầu đề nghị được cấp quyền sử dụng, sau khi được cấp quyền mới chuyển sang bước truy nhập tài nguyên.

4.3.1    Giải thuật tập trung

Giả sử mỗi tiến trình có một số định danh duy nhất và tiến trình được bầu chọn làm điều phối là tiến trình có số hiệu định danh cao nhất. Khi một tiến trình nào đó cần vào vùng tới hạn để truy nhập tài nguyên nó sẽ gửi một thông điệp xin cấp quyền. Nếu không có tiến trình nào đang trong vùng tới hạn thì tiến trình điều phối sẽ gửi phản hồi cấp phép, ngược lại sẽ gửi thông điệp từ chối và chuyển yêu cầu này vào hàng đợi. Khi tiến trình một tiến trình rời khỏi vùng tới hạn nó sẽ gửi một thông điệp đến tiến trình điều phối thông báo trả lại quyền truy nhập, tiến trình điều phối sẽ gửi quyền truy nhập cho tiến trình đầu tiên trong hàng đợi truy nhập.

 

Hình 4.9 Giải thuật tập trung

 

Giải thuật này đảm bảo sẽ chỉ có tối đa một tiến trình trong vùng tới hạn và chỉ cần 3 thông điệp để thiết lập là: Yêu cầu, cấp phép  và giải phóng. Giải thuật này cũng có hai nhược điểm có bản: nếu tiến trình điều phối bị hỏng thì sẽ không có một tiến trình nào được cấp phép, hoặc khi một tiến trình đang trong vùng tới hạn mà bị phong tỏa thì tài nguyên cũng không được giải phóng. Ngoài ra khi qui mô hệ thống ngày càng lớn, nếu chỉ có một tiến trình điều phối thì sẽ xuất hiện hiện tượng thắt cổ chai.

4.3.2    Giải thuật không tập trung

Giải thuật tập trung chỉ có một thành phần điều phối, đó là một cách tiếp cận nghèo nàn, các thành viên chỉ có duy nhất một lựa chọn. Để khắc phục nhược điểm này, mỗi tài nguyên sẽ được nhân bản N lần và mỗi bản sao sẽ có tiến trình điều phối riêng để kiểm soát truy nhập. Một tiến trình muốn truy nhập tài nguyên thì phải gửi yêu cầu đến N tiến trình điều phối đang hoạt động và sẽ được cấp quyền truy nhập khi và chỉ khi nhận được số phiếu đồng ý lớn hơn N/2. So với giải thuật tập trung, giải thuật này ít bị lỗi hơn, gọi p là xác xuất bị lỗi của mỗi tiến trình điều phối, xác xuất k trong m tiến trình điều phối bị lỗi sẽ là:

4.3.3    Giải thuật phân tán

Khi một tiến trình muốn vào vùng tới hạn, trước hết nó sẽ tạo ra một nhãn thời gian và gắn vào thông điệp gửi đến tất cả các tiến trình khác. Các tiến trình khác sau khi nhận được thông điệp này sẽ xảy ra ba tình huống:

-         Nếu không ở trong vùng tới hạn và cũng không có nhu cầu vào vùng tới hạn thì nó sẽ gửi thông điệp chấp nhận.

-         Nếu đang ở trong vùng tới hạn thay vì trả lời nó sẽ đưa vào hàng đợi, chờ đến khi thoát khỏi vùng tới hạn sẽ phản hồi thông điệp chấp nhận và xóa yêu cấu đó trong hàng đợi.

-         Nếu tiến trình cũng có nhu cầu vào vùng tới hạn thì nó sẽ so sánh nhãn thời gian của mình với nhãn thời gian gắn trong thông điệp nhận được. Nếu nhãn thời gian của tiến trình lớn hơn nhãn thời gian trong gán trong thông điệp thì phải phản hồi bằng thông điệp chấp nhận, ngược lại nếu nhãn thời gian của tiến trình nhỏ hơn nhãn thời gian gắn trong thông điệp nhận được thì nó chuyển yêu cầu vào hàng đợi, chờ đến khi không có nhu cầu vào vùng tới hạn thì sẽ lấy thông điệp từ hàng đợi, phản hồi đồng ý cho các tiến trình tương ứng  và đồng thời xóa các thông điệp này trong hàng đợi.

Hình 4.10 Giải thuật phân tán

4.3.4    Giải thuật thẻ bài

Giả thiết tất cả các tiến trình được sắp xếp trên một vòng tròn logic, các tiến trình đều được đánh số và đều biết đến các tiến trình cạnh nó. Khi hệ thống bắt đầu khởi tạo, tiến trình 0 sẽ được trao thẻ bài, thẻ bài này sẽ thể luân chuyển quanh vòng tròn logic. Nó được chuyển từ tiến trình k đến tiến trình kế tiếp k+1 theo kiểu truyền thông điệp  điểm – điểm.

Hình 4.11 Giải thuật thẻ bài

 

Khi một tiến trình nhận được thẻ bài từ tiến trình liền trước, nó sẽ kiểm tra xem có cần thiết vào vùng tới hạn hay không. Nếu không cần thiết thì chuyển thẻ bài cho tiến trình kế tiếp, ngược lại sẽ vào vùng tới hạn. Sau khi hoàn thành phần việc của mình nó sẽ trả thẻ bài cho tiến trình kế tiếp. Vấn đề lớn nhất trong thuật toán truyền thẻ bài là thẻ bài có thẻ bị mất, khi đó hệ thống sẽ phải tạo lại thẻ bài bởi vì việc dò tìm lại thẻ bài là rất khó.

4.3.5    So sánh các giải thuật loại trừ

Để so sánh các giải thuật cần phải dựa trên số lượng thông điệp cần lưu chuyển, độ trễ và những vấn đề tiềm ẩn trong giải thuật.

Giải thuật

Số lượng

thông điệp

Độ trễ

(SL thông điệp)

Nhược điểm

Tập trung

3

2

Tiến trình điều phối lỗi

Phi tập trung

3mk, k=1,2..

2m

Kém hiệu quả

Phân tán

2(n -1)

2(n -1)

Lỗi của bất kỳ tiến trình nào

Thẻ bài

1đến ∞

0  đến n -1

Mất thẻ bài

Giải thuật tập trung đơn giản và hiệu quả nhất, nó chỉ cần ba thông điệp để vào, ra và giải phóng khỏi vùng tới hạn. Nếu mỗi tài nguyên được nhân bản m lần thì giải thuật phi tập trung cần tới 3mk thông điệp, trong đó k=1,2,3.... tương ứng với số lần gửi yêu cầu. Nếu hệ thống gồm n thành viên thì giải thuật phân tán cần 2(n -1) thông điệp, số lượng thông điệp cần gửi trong giải thuật thẻ bài luôn thay đổi.

4.4       Các giải thuật bầu chọn

Nhiều tác vụ trong hệ thống phân tán yêu cầu phải tìm ra một tiến trình bất kỳ để thực hiện vai trò điều phối hay thực hiện vai trò đặc biệt nào đó. Như vậy, cần thiết phải có một giải thuật để tìm ra một tiến trình duy nhất làm tiến trình điều phối hoặc khi tiến trình điều phối gặp lỗi thì sẽ phải có quá trình bầu chọn để tìm ra một tiến trình khác thay thế, hai giải thuật bầu chọn hay được sử dụng là giải thuật nổi bọt (Bully) và giải thuật vòng.

4.4.1    Các giải thuật bầu chọn truyền thống

4.4.1.1     Giải thuật nổi bọt

Giả thiết mỗi tiến trình đều có một định danh duy nhất, tất cả các tiến trình khác đều có thể biết được định danh và địa chỉ của mỗi tiến trình trong hệ thống, giả sử cần phải chọn một tiến trình có định danh cao nhất. Tiến trình bầu chọn sẽ được khởi động  sau khi xảy ra lỗi hoặc tiến trình điều phối bị lỗi. Giải thuật gồm các bước sau:

-         Tiến trình P gửi thông điệp bầu chọn (ELEC) đến tất cả các tiến trình có định danh cao hơn.

-         Nhận được thông điệp từ tiến trình P, các tiến trình sẽ quyết định có tham gia bầu chọn hay không, nếu không tham gia thì không cần trả lời tiến trình P, nếu tham gia thì phải gửi thông điệp không chấp nhận (NOT) cho tiến trình P và đồng thời gửi thông điệp ELEC cho tất cả các tiến trình khác có định danh cao hơn, quá trình bầu chọn lại tiếp tục như tiến trình P.

-         Sau một khoảng thời gian chờ đợi, nếu không có tiến trình nào phản hồi thì P sẽ trở thành tiến trình được bầu chọn và nó gửi thông điệp đến tất cả các tiến trình khác thông báo kết quả bầu chọn.

 

Hình 4.12 Giải thuật bầu chọn nổi bọt

4.4.1.2     Giải thuật vòng

Giả thiết các tiến trình có một định danh duy nhất và được sắp xếp trên một vòng tròn logic, mỗi tiến trình có thể nhận biết được tiến trình kề cạnh.

Hình 4.13 Bầu chọn bằng giải thuật vòng

 

Các bước của giải thuật bao gồm:

1.      Một tiến trình bất kỳ khởi sướng gửi thông điệp bầu chọn đến các tiến trình đang hoạt động gần nhất, quá trình gửi theo một hướng nhất định.

2.      Thăm dò liên tiếp trên vòng cho đến khi tìm được một nút còn tồn tại.

3.      Mỗi tiến trình sẽ gắn định danh của mình vào thông điệp gửi.

4.      Thông điệp sẽ đi qua tất cả các tiến trình đang hoạt động và cuối cùng sẽ trở về tiến trình khởi sướng, khi đó sẽ chọn được một tiến trình có định danh cao nhất và gửi thông điệp đến tiến trình đã được chọn.

5.      Tiến trình được chọn sẽ gửi thông điệp đến tất cả các tiến trình khác để thông báo kết quả bầu chọn

4.4.2    Bầu chọn trong môi trường không dây

Môi trường không dây thường chịu ảnh hưởng của nhiều yếu tố về môi trường dẫn đến độ tin cậy truyền thông không cao. Các giải thuật bầu chọn thường dựa trên giả thiết việc phân phát các thông điệp tin cậy và hình trạng mạng không thay đổi, đó là những yêu cầu khó có thể đáp ứng được và như vậy chỉ có một số rất ít các giải thuật có thể áp dụng trong môi trường không dây. Năm 2004 Vasudevan đã đề xuất giải pháp, thay vì lựa chọn ngẫu nhiên một cách chính xác như các giải thuật bầu chọn truyền thống thì chỉ cần chọn một thành viên tốt nhất. Ví dụ xét một mạng không dây cơ bản, một nút nào đó trong mạng sẽ khởi tạo bằng cách gửi thông điệp bầu chọn đến tất cả những nút láng giềng. Khi nhận được thông điệp bầu chọn, mỗi nút sẽ đánh dấu nút gửi là nút cha nếu đó là thông điệp đầu tiên nhận được và tiếp tục gửi thông điệp bầu chọn đến các nút láng giềng khác ngoại trừ nút cha, nếu không nhận nút gửi là cha thì phải gửi trả lời đã nhận được thông điệp, khi đó nút gửi thông điệp được coi là nút lá và gửi về nút cha giá trị định danh của mình, như vậy nút cha sẽ biết được giá trị định danh của nhánh đó.

Hình 4.14 Bầu chọn trong môi trường không dây

 

Ví dụ trên hình 4.14, giả sử nút a khởi sướng quá trình bầu chọn, nó sẽ gửi thông điệp bầu chọn đến nút b và j. Hai nút này sẽ ghi nhận nút a là cha và b sẽ tiếp tục gửi thông điệp  bầu chọn đến nút c và g nhưng chưa gửi thông tin xác nhận cho a, j sẽ gửi đến g. Giả sử g nhận được thông điệp bầu chọn từ b trước và nó ghi nhận nút b là cha, sau đó mới nhận được thông điệp bầu chọn từ nút j, do đó nó không nhận j là cha nữa mà chỉ gửi cho j thông tin xác nhận, j nhận được bản tin này thấy g không nhận j làm cha nên gửi giá trị của nó cho a, như vậy a coi giá trị định danh lớn nhất của nhánh a qua j là j:4. Nút g chuyển thông điệp bầu chọn cho nút h và e, cả hai nút này đều chọn g là cha nên nút h chuyển thông điệp bầu chọn đến nút i và nút e chuyển thông điệp bầu chọn đến nút f. Nút  f nhận nút e là cha và chuyển thông điệp đến nút i và d, tuy nhiên hai nút này không nhận f là cha nên f sẽ thông báo định danh f:4 của nó cho e, các nút c và d cũng không nhận e là cha nên nút e gửi về cho nút g giá trị f:4. Nút i nhận nút h là cha, nó chuyển tiếp thông điệp đến nút f, tuy nhiên nút f đã nhận nút e là cha nút i gửi cho nút h thông điệp nhánh qua i có định danh cao nhất là i:5. Sau khi nhận được kết quả từ nút i, nút h gửi thông điệp cho nút g với định danh cao nhất là h:8, nút g tổng hợp và gửi cho nút b thông báo định danh cao nhất qua nhánh g là h:8.  Quá trình tiếp tục như vậy cho các nút khác, đường nét đậm đánh dấu các nút cha, cuối cùng nút b nhận được kết quả bầu chọn từ nhánh qua g có định danh cao nhất là h:8 và nhánh qua c có định danh cao nhất là c:3 nên nó sẽ gửi về cho a định danh h:8 là cao nhất, như vậy nút a sẽ tìm được nút h với giá trị cao nhất là h:8 xứng đáng làm nút được bầu chọn.

4.4.3    Bầu chọn trong các hệ thống qui mô lớn

Các thuật toán bầu chọn truyền thống thường chỉ áp dụng cho các hệ thống qui mô nhỏ, hơn nữa các thuật toán đó mới chỉ tập trung bầu chọn một nút. Một số tình huống đòi hỏi bầu chọn nhiều nút, ví dụ các nút đại diện của các mạng ngang hàng. Các nút đại diện cần phải đáp ứng các tiêu chí sau:

-         Thông tin gửi từ các nút thường đến các nút đại diện có độ trễ nhỏ

-         Các nút đại diện nên phân bố đều trên mạng phủ

-         Nên xác định trước số lượng các nút trong mạng phủ

-         Mỗi nút đại diện không nên phục vụ vượt quá số lượng đã qui định

Hình 4.15 Bầu chọn trong hệ thống qui mô lớn

 

Rất may, các tiêu chí trên hầu như dễ dàng thỏa mãn trong các mạng ngang hàng. Giả sử cần chọn đại diện cho hệ thống dựa trên bàng băm phân tán mà mỗi thành viên được gán m-bit định danh, chọn những định danh k-bit đại diện tính từ bên trái thì chỉ cần thực hiện phép toán AND nhị phân trong đó k bit bên trái có giá trị bằng 1 và các bit còn lại có giá trị bằng 0. Ví dụ, k=3 và m=8 khi đó chỉ cần lấy định danh và thực hiện phép tính AND với 1110 0000 sẽ cho ra nút đại diện của nhóm 8 thành viên. 

4.5       Hệ thống định vị

 

4.5.1    Định vị toàn cầu các nút

Hệ thống định vị toàn cầu GPS (NAVSTAR GPS - Navigation Satellite Timing and Ranging Global Poritioning System) là một hệ thống các vệ tinh có khả năng xác định vị trí trên toàn cầu với độ chính xác khá cao do Bộ quốc phòng Mỹ xây dựng từ những năm 1970. Ban đầu, GPS được xây dựng để phục vụ cho các mục đích quân sự, tuy nhiên sau này cho phép sử dụng cả trong lĩnh vực dân sự. GPS bao gồm một mạng lưới 29 vệ tinh, để có khả năng hoạt động tốt thì số lượng vệ tinh trong mạng lưới phải luôn luôn lớn hơn 24. Để đảm bảo vùng phủ sóng liên tục trên toàn thế giới, các vệ tinh GPS được sắp xếp sao cho 4 vệ tinh sẽ nằm cùng nhau trên 1 trong 6 mặt phẳng quỹ đạo. Với cách sắp xếp này sẽ có 4 đến 10 vệ tinh được nhìn thấy tại bất kỳ điểm nào trên trái đất với góc ngẩng là 100 nhưng thực tế chỉ cần 4 vệ tinh là có thể cung cấp đầy đủ các thông tin về vị trí. Các quỹ đạo vệ tinh GPS là những đường vòng elip với độ lệch tâm cực đại là 0.01, nghiêng khoảng 550 so với đường xích đạo. Độ cao của các vệ tinh so với bề mặt trái đất là khoảng 20.200 km, chu kỳ quỹ đạo các vệ tinh GPS khoảng 12 giờ, chính xác là 11 giờ 58 phút.

Khi số lượng các nút trong hệ phân tán tăng lên thì nhiệm vụ duy trì thông tin của các nút khác trở nên rất phức tạp. Trong các mạng địa lý, mỗi nút được được đặt tại một tọa độ địa lý nhất định và có thể tính toán được khoảng cách giữa các nút, nhưng khoảng cách càng xa thì càng cần nhiều thời gian để lưu chuyển thông điệp. Để giảm thiểu thời gian truy nhập người ta thường nhân bản các máy chủ dịch vụ, như vậy  cần phải có các giải thuật để tìm kiếm máy chủ gần nhất đối với máy khách.

4.5.2    Kỹ thuật định vị khác

4.5.3    Định vị logic các nút

 


CHƯƠNG 5:                   TIẾN TRÌNH TRONG CÁC HỆ THỐNG PHÂN TÁN

Khái niệm tiến trình xuất phát từ lĩnh vực hệ điều hành, một chương trình đang chạy thì được gọi là tiến trình. Một trong những nhiệm vụ chính của hệ điều hành là quản lý và lập lịch cho các tiến trình, tuy nhiên trong hệ thống phân tán sẽ phát sinh nhiều vấn đề phức tạp và quan trọng hơn rất nhiều. Tiến trình tạo nên các khối chức năng trong hệ thống phân tán, thực tế cho thấy việc phân chia như vậy chưa đủ, cần thiết phải nhìn nhận vấn đề một cách chi tiết hơn. Ví dụ, trong hệ thống phân tán sẽ phải thường xuyên áp dụng kỹ thuật đa luồng (multithread) nhằm nâng cao hiệu suất hoạt động của hệ thống, với kỹ thuật đó quá trình trao đổi thông tin khách/chủ và các xử lý cục bộ được thực hiện đồng thời với nhau.

Trong những năm gần đây, khái niệm ảo hóa ngày càng trở nên phổ biến. Bằng kỹ thuật ảo hóa, nhiều ứng dụng và thậm chí nhiều hệ điều hành có thể chạy song hành độc lập trên một nền tảng phần cứng, điều này cho phép tận dụng tối đa tài nguyên và đồng thời cách ly được các lỗi phát sinh của mỗi tiến trình hoặc các lỗi về bảo mật. Một vấn đề quan trọng nữa là vấn đề di chuyển các tiến trình giữa các máy khác nhau trong hệ thống phân tán. Việc di chuyển tiến trình hay đặc biệt hơn là việc di trú mã có thể giúp đạt được qui mô hệ thống lớn hơn nhưng cũng có thể đạt được mục tiêu cấu hình động cho máy khách và máy chủ.

5.1       Các luồng

Theo quan điểm hệ điều hành, việc quản lý và lập lịch cho các tiến trình đóng vai trò quan trọng nhất. Trong hệ thống phân tán, vấn đề trao đổi thông tin giữa các tiến trình nảy sinh nhiều vấn đề khá phức tạp, ngoài việc quản lý các tiến trình cần phải đảm bảo hiệu suất hoạt động của hệ thống. Mặc dù các tiến trình hình thành nên các khối xây dựng hệ thống phân tán nhưng thực tiễn cho thấy cần thiết phải chia nhỏ tiến trình thành các đơn vị nhỏ hơn để có thể dễ dàng hơn trong việc xây dựng các ứng dụng phân tán và đồng thời đạt được hiệu năng cao hơn. Phần này sẽ giới thiệu vai trò của các luồng trong hệ thống phân tán, chi tiết cách sử dụng để xây dựng ứng dụng phân tán cần xem thêm tài liệu Multithreaded Programming With threads của Bil Lewis.

5.1.1    Khái niệm luồng

Để hiểu về vai trò của luồng trong hệ thống phân tán, trước hết cần phải hiểu tiến trình là gì và mối quan hệ của nó với các luồng. Mỗi chương trình khi chạy cần phải được cung cấp một bộ xử lý, như vậy để đáp ứng yêu cầu cùng một lúc chạy được nhiều chương trình thì hệ điều hành phải tạo ra một số bộ xử lý ảo cho mỗi chương trình. Nhằm mục đích quản lý các bộ xử lý ảo này, hệ điều hành tạo bảng tiến trình chứa thông tin giá trị các thành ghi của đơn vị xử lý trung tâm, bản đồ bộ nhớ, các tập tin đang dùng, thông tin tài khoản và các quyền thực hiện có liên quan…, do đó tiến trình có thể được hiểu như là một chương trình đang chạy trên bộ xử lý ảo. Nói cách khác, nhiều tiến trình chạy đồng thời và dùng chung đơn vị xử lý trung tâm cũng như các tài nguyên khác mà không làm ảnh hưởng tới nhau, như vậy sẽ đảm bảo tính trong suốt của hệ thống. Thường thường, hệ điều hành sẽ yêu cầu phần cứng hỗ trợ để thực hiện việc tách biệt này.

Để đạt được tính trong suốt, hệ điều hành phải trả giá khá cao trong các thao tác xử lý, nó phải tạo một không gian bộ nhớ riêng cho mỗi tiến trình. Không gian đó được mô phỏng như một hệ vi xử lý thực sự, phải có các thanh ghi và vùng nhớ để lưu trữ dữ liệu. Tại một thời điểm chỉ có duy nhất một tiến trình được phép sử dụng tài nguyên vật lý (CPU và vùng nhớ thực thi chương trình), chi phí về thời gian xử lý sẽ phát sinh trong di chuyển dữ liệu giữa bộ xử lý ảo và bộ xử lý vật lý: Hệ điều hành phải sao chép toàn bộ dữ liệu của tiến trình đang chạy vào vùng nhớ đã qui định của tiến trình đó, sau đó mới sao chép dữ liệu của tiến trình kế tiếp vào bộ xử lý vật lý.  Khi các tiến trình sử dụng hết bộ nhớ chính, nó sẽ sử dụng một phần ổ đĩa để làm bộ nhớ, như vậy sẽ phát sinh rất nhiều các thao tác đọc/ghi đĩa, điều này sẽ làm suy giảm nghiêm trọng hiệu năng xử lý của hệ thống. Giống như tiến trình, luồng thực hiện đoạn mã chương trình của mình độc lập với các luồng khác. Tuy nhiên, điểm khác biệt cơ bản so với tiến trình, luồng không cố đạt độ trong suốt cao nếu thao tác đó làm suy giảm hiệu năng hoạt động, do đó hệ thống luồng thường chỉ duy trì thông tin tối thiểu nhằm chia sẻ đơn vị xử lý trung tâm. Cụ thể, vấn đề quản lý luồng được thực hiện theo cơ chế đóng/mớ, tính toàn vẹn của dữ liệu do người phát triển phần mềm ứng dụng đảm nhiệm.

5.1.2    Luồng trong các hệ thống độc lập

           Trước khi tìm hiểu vai trò của luồng trong các hệ thống phân tán, chúng ta hãy thử xem xét nó trên một hệ thống độc lập. Ví dụ trang bảng tính Excel: Các ô trong bảng tính độc lập với nhau, nếu người sử dụng thay đổi giá trị của một ô thì sẽ làm thay đổi giá trị của các ô có liên quan với ô dữ liệu đó. Nếu chỉ sử dụng một luồng thì công việc tính toán sẽ không được thực hiện trong khi nhập dữ liệu và ngược lại khi đang tính toán thì người dùng sẽ không nhập được dữ liệu. Như vậy ở đây cần phải có hai luồng xử lý: một luồng giao tiếp với người sử dụng và một luồng khác cập nhật thông tin của trang, thậm chí cần thiết phải có luồng thứ ba thực hiện nhiệm vụ sao lưu dữ liệu vào ổ đĩa. Một ví dụ khác về ứng dụng đa luồng trong kỹ thuật xử lý song song, trong các hệ thống nhiều bộ vi xử lý, mỗi luồng được gán cho một bộ xử lý nhưng vẫn dùng chung bộ nhớ chính, kỹ thuật này thường được cài đặt trên các ứng dụng máy chủ trong mô hình khách/chủ.

Hình 5.1 Chuyển ngữ cảnh giữa các tiến trình

 

Kỹ thuật xử lý đa luồng cũng được áp dụng để xây dựng những ứng dụng qui mô lớn, đó là những ứng dụng bao gồm nhiều chương trình cộng tác, mỗi chương trình sử dụng một tiến trình riêng, tương tác giữa các chương trình được thực hiện bằng cơ chế truyền thông liên tiến trình (IPC) ví dụ như kỹ thuật đường ống, hàng đợi thông điệp hay vùng nhớ dùng chung. Nhược điểm cơ bản của của cơ chế này là vấn đề luân chuyển từ tiến trình này sang tiến trình khác. Hình 5.1 minh họa việc chuyển tiến trình, trước tiên tiến trình phải chuyển từ không gian người dùng sang không gian lõi, điều này sẽ làm thay đổi bản đồ bộ nhớ trong khối quản lý bộ nhớ MMU (Memory Management Unit) và xây dựng lại vùng đệm chuyển đổi TLB (Translation Look-aside Buffer), bên trong lõi sẽ xảy ra quá trình chuyển ngữ cảnh xử lý và sau đó sẽ chuyển sang không gian người dùng, quá trình này cũng đòi hỏi phải thay đổi MMU và TLB. Thay cho kiến trúc tiến trình, ứng dụng có thể được phân thành nhiều phần khác nhau, mỗi phần sẽ tương ứng với một luồng. Trao đổi thông tin giữa các luồng này được thực hiện bằng việc chia sẻ dữ liệu, việc chuyển đổi từ luồng này sang luồng khác được thực hiện trong không gian người dùng, rất ít khi sử dụng đến cơ chế lập lịch trong không gian lõi, vì vậy hiệu năng của hệ thống sẽ tăng lên đáng kể.

5.1.3    Cài đặt luồng

Luồng thường được cung cấp dưới dạng gói luồng, những gói như vậy bao gồm các thao tác tạo và hủy luồng giống như các thao tác trên biến đồng bộ. Có hai cách tiếp cận cơ bản: tạo thư viện luồng mức người dùng hoặc mức lõi. Với cách tiếp cận thứ nhất, luồng sẽ được thực hiện hoàn toàn trong chế độ người dùng, như vậy các thao tác tạo, hủy và chuyển luồng sẽ được thực hiện tương đối dễ dàng với chi phí khá thấp. Thao tác tạo luồng chỉ đơn giản là việc định vị không gian bộ nhớ, hủy luồng chỉ cần giải phóng vùng nhó không còn sử dụng nữa. Chi phí thực hiện chuyển luồng cũng không lớn, về cơ bản chỉ cần vài chỉ thị lệnh chuyển dữ liệu trong các thanh ghi của đơn vị xử lý trung tâm mà không cần phải cập nhật lại bản đồ bộ nhớ và vùng đệm TBL. Cách tiếp cận này có điểm hạn chế  là sử dụng phương pháp gọi phong tỏa, khi một luồng đang thực hiện thì tất cả các luồng khác trong tiến trình đó sẽ phải tạm ngừng. Cách tiếp cận thứ hai sẽ loại bỏ nhược điểm trên, tất cả các thao tác tạo, hủy hoặc chuyển luồng đều do mức lõi thực hiện, điều này lại quay trở lại mô hình tiến trình, như vậy sẽ mất đi những ưu điểm của kỹ thuật xử lý đa luồng.

Hình 5.2 Kết hợp tiến trình con và các luồng mức người dùng

 

Giải pháp ở đây là phải kết hợp cả hai cách tiếp cận trên, nghĩa là phải kết hợp luồng ở mức người dùng và mức lõi, những luồng như vậy gọi là tiến trình con LWP. Một tiến trình chính sẽ bao gồm một số tiến trình hạng nhẹ, thư viện luồng hoàn toàn nằm ở mức người dùng, thao tác chuyển luồng được thực hiện thông quan các biến đồng bộ mà không cần sự can thiệp của mức lõi. Các tiến trình con chia sẻ gói luồng và mỗi tiến trình con sẽ chạy một luồng của nó ở mức người dùng. Các ứng dụng đa luồng được xây dựng bằng cách tạo ra các luồng và sau đó gán cho mỗi tiến trình con, công việc này thường được thực hiện không tường minh và hoàn toàn trong suốt đối với lập trình viên. Tổ hợp hoạt động giữa gói luồng và các tiến trình con được thực hiện như sau: Mỗi tiến trình con sẽ tạo ra một ngăn xếp riêng chứa các luồng sẽ được thực hiện, các luồng được quản lý trong bảng luồng và được bảo vệ bằng cơ chế biến đồng bộ. Như vậy mỗi tiến trình con khi gọi đến luồng nào đó chỉ cần tìm kiếm trong bảng luồng và thực hiện việc chuyển ngữ cảnh hoàn toàng trong chế độ người dùng. Trường hợp một luồng nào đó thực hiện lời gọi phong tỏa hệ thống thì nó chuyển từ chế độ người dùng sang chế độ lõi nhưng vẫn nằm trong tiến trình con.

5.1.4    Luồng trong các hệ thống phân tán

Một đặc tính quan trọng của luồng chúng cung cấp các phương tiện dễ dàng cho phép gọi phong tỏa hệ thống nhưng không phong tỏa toàn bộ tiến trình đang chạy, do đó kỹ thuật này thường được sử dụng trong các hệ thống phân tán để duy trì truyền thông dưới dạng các kênh logic. Ví dụ, trong mô hình khách/chủ, máy khách tạo ra nhiều luồng chạy song song độc lập với nhau, máy chủ cũng tạo ra nhiều luồng để có thể đồng thời tiếp nhận và xử lý các yêu cầu của máy khách.

5.1.4.1     Đa luồng trên máy khách

Trên mạng diện rộng, thông tin di chuyển từ máy tính này sang máy tính khác sẽ mất một khoảng thời gian nhất định, đôi khi cũng có thể lên tới vài giây. Để đảm bảo tính trong suốt phân bố tài nguyên thì các ứng dụng phân tán cần phải che giấu thời gian lan truyền của các thông điệp. Cách thông thường để che giấu độ trễ truyền tin là khởi tạo kênh truyền sau đó thực hiện một thao tác nào đó. Ví dụ, khi duyệt một trang tin điện tử, trình duyệt sử dụng giao thức HTTP để lấy dữ liệu từ máy chủ về máy khách. Nếu hiển thị thông tin cho người dùng sau khi đã tải toàn bộ dữ liệu của trang thì thời gian chờ đợi sẽ tương đối dài, để giải quyết vấn đề này, sau khi lấy được khung dữ liệu của toàn bộ trang, máy khách sẽ tạo ra nhiều luồng riêng biệt, mỗi luồng sẽ lấy dữ liệu một phần của trang, nhận được dữ liệu của phần nào thì hiển thị ngay thông tin của phần đó. Như vậy, mỗi luồng trên máy khách sẽ thiết lập một kết nối mới gửi tới máy chủ, điều này làm tăng số lượng yêu cầu lên máy chủ và khi số lượng yêu cầu vượt quá khả năng xử lý thì các yêu cầu này sẽ được đưa vào hàng đợi chờ xử lý, như vậy hiệu năng của hệ thống sẽ không được cải thiện. Trong nhiều trường hợp, máy chủ được tổ chức  thành từng cụm, mỗi yêu cầu của máy khách không phải chỉ xử lý trên một máy chủ mà có thể sẽ được chuyển đến máy khác xử lý, do đó đòi hỏi phải triển khai kỹ thuật xử lý song song trên cả máy khách lẫn máy chủ.

5.1.4.2     Đa luồng trên máy chủ

Kỹ thuật xử lý đa luồng trên máy khách đóng vai trò rất quan trọng nhưng thực tế cho thấy việc triển khai kỹ thuật này trên máy chủ mới là nhân tố quyết định hiệu năng của hệ thống phân tán. Kỹ thuật xử lý đa luồng không những đơn giản hóa đáng kể cách viết các phần mềm mà còn làm cho việc triển khai kỹ thuật xử lý song song để đạt được hiệu năng cao nhất, dù cho đó là máy tính một hay nhiều bộ vi xử lý. Ví dụ về hệ thống cung cấp dịch vụ truyền tập tin, tập tin được lưu trữ trên ổ đĩa và quá trình đọc các khối dữ liệu trên ổ đĩa chiếm thời gian đáng kể so với các thao tác khác trong phiên làm việc.  Bằng cách áp dụng kỹ thuật xử lý đa luồng, máy chủ sẽ tạo ra một luồng chuyên để tiếp nhận các yêu cầu của máy khách và nhiều luồng khác có nhiệm vụ đọc dữ liệu trên ổ đĩa. Khi nhận yêu cầu đọc tập tin, thành phần tiếp nhận yêu cầu sẽ quyết định giao cho tiến trình đọc/ghi nào đó thực hiện sau đó lại tiếp tục trở về trạng thái sẵn sàng tiếp nhận các yêu cầu khác từ máy khách. Nhận được yêu cầu đọc dữ liệu, một luồng thực thi đọc/ghi sẽ được khởi tạo bằng cách mở tập tin và chờ cho đến khi hoàn thành quá trình đọc, sau  khi đọc xong sẽ gửi kết quả về cho tiến thành phần tiếp nhận để trả về cho máy khách. Nếu chỉ sử dụng một luồng xử lý, vòng lặp của chương trình chính sẽ tiếp nhận và hoàn thành việc thực thi nhiệm vụ trước khi tiếp nhận yêu cầu kế tiếp, như vậy trong khi chờ đọc dữ liệu từ ổ đĩa máy chủ tuy ở trạng thái nghỉ nhưng vẫn không tiếp nhận thêm yêu cầu nào, kết quả là nhiều yêu cầu của máy khách sẽ không được xử lý. Như vậy có thể thấy việc áp dụng kỹ thuật đa luồng đã làm tăng đáng kể hiệu năng xử lý nhưng mỗi luồng vẫn được lập trình theo phương pháp thông thường.

Hình 5.3 Xử lý đa luồng trên máy chủ

            

Một giải pháp khác chỉ áp dụng kỹ thuật đơn luồng nhưng vẫn có khả năng cho hiệu năng cao đó là phương pháp máy trạng thái hữu hạn. Khi có một yêu câu gửi đến, một tiến trình duy nhất sẽ kiểm tra xem dữ liệu trong bộ đệm dữ liệu (cache) có đáp ứng yêu cầu hay không, nếu đáp ứng được yêu cầu thì sẽ trả về cho máy khách, nếu không đáp ứng sẽ phải đọc từ ổ đĩa. Tuy nhiên thay vì việc phong tỏa, nó thiết lập trạng thái của yêu cầu và lưu vào bảng quản lý yêu cầu và tiếp tục xử lý các thông điệp khác chuyển đến. Nếu thông điệp mới chuyển đến là yêu cầu từ phía máy khách thì sẽ tạo một công việc mới, nếu đó là kết quả yêu cầu đọc ổ đĩa từ thao tác trước thì sẽ lấy lại thông tin của yêu cầu tương ứng và trả về cho máy khách. Với phương pháp này, máy chủ sẽ không cần phải thực hiện các thao tác phong  tỏa khi gửi và nhận thông điệp và đồng thời loại bỏ được đặc điểm xử lý tuần tự của hai phương pháp trước, trạng thái tính toán được lưu tường minh khi gửi hoạc nhận mỗi thông điệp, tiến trình vận hành như máy trạng thái hữu hạn, nó lấy sự kiện và phản hồi tùy thuộc vào cái gì chứa trong tiến trình đó.

Mô hình

Đặc điểm

Đa luống

Song song, phong tỏa hệ thống

Đơn luồng

Tuần tự, phong tỏa hệ thống

Máy trạng thái

Song song, không phong tỏa hệ thống

Tóm lại, trên máy chủ có thể áp dụng ba kỹ thuật xử lý đa luồng, đơn luồng hoặc máy trạng thái hữu hạn. Kỹ thuật đa luồng cho phép xử lý song song nhưng vẫn sử dụng phương pháp gọi phong tỏa hệ thống. Kỹ thuật đơn luồng không những phong tỏa hệ thống mà còn không hỗ trợ xử lý song song, đôi khi sẽ làm giảm hiệu năng của hệ thống. Kỹ thuật máy trạng thái hữu hạn cho phép xử lý song song và không phong tỏa hệ thống, tuy nhiên việc lập trình sẽ phức tạp hơn rất nhiều.

5.2       Ảo hóa

Xử lý đa luồng và đa tiến trình có thể được nhìn nhận như một cách thực hiện nhiều công việc trong cùng một thời điểm, làm cho hiệu năng của hệ thống cao hơn. Nếu máy tính chỉ có một bộ vi xử lý thì việc chạy đồng thời nhiều tiến trình chỉ là ảo giác, bởi vì tại một thời điểm bộ vi xử lý chỉ có thể thực thi được một lệnh, bằng cách chuyển rất nhanh từ tiến trình này sang tiến trình khác hoặc từ luồng này sang luồng khác tạo ra cảm giác các chúng chạy song song với nhau. Ý tưởng ảo hóa xuất phát từ nhu cầu thực tế, tài nguyên vật lý chỉ có một nhưng nhiều thành phần cùng sử dụng chung tài nguyên và thành phần nào cũng muốn tài nguyên đó thuộc về mình. Như vậy sẽ nảy sinh vấn đề tương tranh giữa các tiến trình, vì vậy kỹ thuật ảo hóa đã được áp dụng vừa để đáp ứng nhu cầu sở hữu riêng tài nguyên của các tiến trình và đồng thời không để xảy ra tranh chấp trong hệ thống.

5.2.1    Vai trò ảo hóa trong các hệ thống phân tán

Các hệ thống máy tính được tổ chức theo mô hình phân tầng, tầng thấp hơn sẽ cung cấp giao diện lập trình cho các tầng mức cao hơn. Có nhiều loại giao diện, thấp nhất là giao diện với bộ xử lý trung tâm cho đến thư viện giao diện lập trình ứng dụng do các hệ thống trung gian cung cấp. Sự ảo hóa ở đây thể hiện bằng cách mở rộng hoặc thay thế giao diện hiện hành để bắt chước hành vi của hệ thống khác.

 

Hình 5.4 Ảo hóa trong hệ thống phân tán

 

Những năm 70 của thế kỷ trước, giá thành của máy tính rất đắt mà số lượng phần mềm chưa nhiều và các hệ điều hành thường phát triển cho một loại phần mềm nào đó. Ý tưởng ảo hóa được IBM triển khai nhằm tiết kiệm chi phí và cho phép các hệ thống phần mềm cũ có thể chạy trên máy chủ thế hệ mới. Khi giá thành phần cứng giảm dần, công nghệ phần cứng thay đổi nhanh hơn các ứng dụng phần mềm, vai trò ảo hóa chuyển dần sang nhiệm vụ đảm bảo tính tương thích với các hệ thống cũ. Đặc biệt, với sự bùng nổ của mạng Internet, nhiều hệ thống phần mềm lớn được xây dựng trên các nền tảng hệ thống khác nhau, việc ảo hóa nhằm tạo điều kiện cho các hệ thống dễ dàng tương tác với nhau. Ảo hóa sẽ giúp tăng cường tính khả chuyển và tính linh hoạt của hệ thống, ví dụ hỗ trợ cho việc nhân bản dữ liệu, góp phần nâng cao tính trong suốt của hệ thống. Ảo hóa giúp nâng cao tính năng bảo mật của hệ thống, các thành phần bên ngoài không được phép truy nhập trực tiếp vào các đối tượng bên trong hệ thống. Ngoài ra, kỹ thuật ảo hóa có thể hạn chế thậm chí loại bỏ các sự cố tương tranh, điều này giúp cho hệ thống hoạt động hiệu quả hơn.

5.2.2    Kiến trúc của các máy ảo

Có nhiều cách để thực hiện việc ảo hóa, để hiểu các hình thức này trước hết cần phải phân biệt bốn loại giao diện sau:

-         Giao diện giữa phần cứng và phần mềm bao gồm các chỉ thị lệnh  mà bất kỳ chương trình nào cũng có thể gọi.

-         Giao diện giữa phần cứng và phần mềm bao gồm các chỉ thị lệnh  mà chỉ một số chương trình có đặc quyền mới được phép gọi, ví dụ hệ điều hành.

-         Giao diện gồm các lời gọi hệ thống do hệ điều hành cung cấp

-         Giao diện gồm các lời gọi thư viện hình thành trong thư viện giao diện lập trình ứng dụng (API), trong nhiều trường hợp các lời gọi hệ thống ẩn trong thư viện này.

 

Hình 5.5 Ảo hóa bằng giao diện lập trình ứng dụng

 

Bốn loại giao diện kể trên được thể hiện trên hình 5.5 và đó là những vấn đề cốt yếu của ảo hóa để bắt chước hành vi của các giao diện. Có thể cài đặt ảo hóa bằng hai hình thức, máy ảo tiến trình và giám sát máy ảo. Hình thức thứ nhất xây dựng hệ thống thực hiện thao thời gian, về cơ bản cung cấp tập chỉ thị lệnh trừu tượng dùng để thực thi phần mềm ứng dụng, các chỉ thị lệnh này sẽ được thông dịch trực tiếp, ví dụ môi trường chạy Java hoặc cũng có thể được mô phỏng như thực hiện các ứng dụng Windows trên nền tảng hệ điều hành Unix, hình thức ảo hóa này chủ yếu áp dụng cho một tiến trình. Hình thức thứ hai dựa trên kiến trúc phân tầng, nó che đậy hoàn toàn phần cứng nhưng cung cấp đầy đủ các chỉ thị lệnh của phần cứng gọi là giao diện. Điểm quan trọng trong hình thức thứ hai là giao diện của nó cung cấp đồng thời cho nhiều chương trình khác nhau, điều đó dẫn tới việc nhiều hệ điều hành có thể cùng chạy trên một nền tảng phần cứng.

Hình 5.6 Hai hình thức ảo hóa

 

Ví dụ, sử dụng phẩn mềm máy ảo VMware thì có thể cài đặt đồng thời nhiều hệ điều hành trên cùng một nền tảng phần cứng. Như vậy, hệ điều hành giao tiếp với phần cứng qua lớp máy ảo, hình thức này ngày càng trở nên quan trọng trong việc giải quyết vấn đề tin cậy và bảo mật các hệ thống phân tán. Giám sát máy ảo cho phép cách ly toàn bộ các ứng dụng với môi trường của chúng, nếu xảy ra lỗi do tấn công bảo mật thì không còn ảnh hưởng đến toàn bộ máy. Ngoài ra, giám sát máy ảo còn nâng cao tính khả chuyển của hệ thống, nó tách biệt phần cứng với phần mềm và như vậy có thể chuyển toàn bộ phần mềm từ nền tảng phần cứng này sang nền tảng phần cứng khác.

5.3       Máy khách

Nhiệm vụ chính của máy khách là cung cấp giao diện cho người sử dụng để tương tác với máy chủ, hình thức thể hiện giao diện với người sử dụng là một trong những vấn đề quan trọng trong qui trình phát triển phần mềm. Ngoài ra, tùy theo cách tổ chức xử lý, máy khách có thể thực hiện nhiệm vụ tiền xử lý các dữ liệu trước khi chuyển yêu cầu đến máy chủ.

5.3.1    Giao diện người sử dụng mạng

 

Hình 5.7 Giao thức tầng ứng dụng

Nhìn chung, tương tác giữa máy khách và máy chủ được thực hiện theo hai cách. Cách thứ nhất, với mỗi dịch vụ trên máy chủ sẽ có thành phần tương ứng trên máy khách để có thể liên lạc với dịch vụ qua mạng, như vậy tầng ứng dụng trên máy khách sử dụng giao thức riêng để đồng bộ dữ liệu trên máy chủ. Đại diện cho hình thức này có thể kể đến các ứng dụng điện thoại di động và các ứng dụng dạng cửa sổ trên máy tính, các ứng dụng này sẽ sao chép dữ liệu của dịch vụ về máy khách để xử lý và hiển thị theo cách riêng của máy khách, việc đồng bộ dữ liệu của dịch vụ với máy chủ được thực hiện theo cách riêng của người phát triển ứng dụng.

Cách thứ hai, máy khách không lưu trữ dữ liệu mà sử dụng giao thức chung để lấy dữ liệu từ máy chủ và hiển thị cho người sử dụng, như vậy cả dữ liệu và các dạng hiển thị cho người dùng đều được lưu trữ trên máy chủ. Ví dụ thông tin của dịch vụ được hiển thị trên các trình duyệt của máy khách, máy khách chỉ đóng vai trò hiển thị mà không có chức năng xử lý dữ liệu, cách tiếp cận này ngày càng trở nên phổ biến trong môi trường Internet.

5.3.2    Phần mềm máy khách đảm bảo tính trong suốt phân bố

Tiến trình trên máy khách không những đảm nhiệm các chức năng giao tiếp người dùng mà còn phải thực hiện nhiều nhiệm vụ khác như xử lý dữ liệu, truy nhập tài nguyên trên máy chủ..., những chức năng này càng trong suốt đối với người dùng càng tốt, trái ngược hẳn với quan điểm xây dựng các ứng dụng trên máy chủ. Tính trong suốt truy nhập được xử lý bằng cách tạo xây dựng thành phần có giao diện như trên máy chủ nhưng che giấu kiến trúc máy và hình thức trao đổi thông tin. Vấn đề trong suốt phân bố tài nguyên thường được xử lý bằng hệ thống đặt tên, tuy nhiên trong những trường hợp máy khách đã kết nối tới máy chủ nào đó thì máy chủ có thể gửi thông tin di trú đến tầng trung gian nằm cài đặt trên máy khách để thực hiện kết nối đến máy chủ mới, điều này có thể tạm thời làm suy giảm hiệu năng của máy khách.

Hình 5.8 Tính trong suốt truy nhập tài nguyên

 

Nếu máy chủ được nhân bản, máy khách có thể gửi yêu cầu đến tất cả máy chủ nhưng sẽ chỉ nhận kết quá trả về từ 01 máy. Để đảm bảo tính trong suốt về lỗi, đối với lỗi truyền thông thì phần mềm trung gian trên máy khách có thể gửi lại một vài lần hoặc gửi yêu cầu đến máy chủ khác xử lý, trường hợp xấu nhất có thể lấy dữ liệu đã được phiên liền trước ghi nhớ trong vùng đệm dữ liệu. Tính trong suốt tương tranh thường được giải quyết trên các máy chủ, ví dụ sử dụng hệ thống giám sát tương tranh, máy khách ít khi phải xử lý vấn đề này.

5.4       Máy chủ

Máy chủ là máy chạy các tiến trình cung cấp dịch vụ theo yêu cầu của máy khách, chúng thường là những máy tính có cấu hình đủ lớn để luôn sẵn sàng đáp ứng các yêu cầu dịch vụ của các máy khách.

5.4.1    Các vấn đề thiết kế chung

Thực chất, các máy chủ đều được tổ chức theo cách giống nhau, nó chờ yêu cầu từ máy khách gửi tới và thực thi yêu cầu và sau đó lại chờ yêu cầu tiếp theo. Có nhiều hình thức thiết kế hệ thống máy chủ, có thể một máy chủ được tổ chức đơn luồng, đa luồng, đa tiến trình hoặc cụm máy chủ. Với một máy chủ đơn luồng nó phải tiếp nhận yêu cầu và xử lý sau đó trả về kết quả cho máy khách và tiếp tục nhận yêu cầu mới. Máy chủ đa luồng tiếp nhận yêu cầu nhưng không xử lý mà chuyển yêu cầu đó cho luồng khác hoặc cho một tiến trình khác để xử lý và sau đó lại tiếp tục nhận các yêu cầu mới.

Hình 5.9 Cài đặt các tiến trình theo mô hình khách/chủ

 

Đối với các hệ thống tương tranh bắt buộc phải thiết kế dưới dạng đa luồng hoặc đa tiến trình. Một vấn đề quan trọng cần phải giải quyết đó là làm thế nào máy khách biết được điểm truy nhập dịch vụ? Để giải quyết vấn đề này người ta đã qui định trên mối máy tính có 65636 cổng, các cổng từ 0-1024 là dành cho những dịch vụ công cộng. Như vậy, mỗi tiến trình cung cấp dịch vụ trên máy chủ sẽ được gán cho  một cổng và máy chủ thường xuyên nghe cổng đó. Máy khách muốn sử dụng dịch vụ thì phải cung cấp cặp thông tin địa chỉ máy chủ và cổng dịch vụ. Tuy nhiên, một số dịch vụ không sử dụng đến cổng (ví dụ dịch vụ cung cấp thời gian), trong trường hợp này máy chủ phải gán điểm truy nhập dịch vụ động và gán cho mỗi hệ điều hành và đồng thời phải có một tiến trình đặc biệt gọi là daemon luôn theo dõi điểm truy nhập dịch vụ này. Thông thường mỗi điểm cuối sẽ được gán cho một dịch vụ riêng biệt, nếu cài đặt mỗi dịch vụ lại sử dụng các phương điều này của máy chủ riêng biệt sẽ lãng phí tài nguyên. Điều này có thể giải quyết bằng cách cung cấp một tiến trình chuyên tiếp nhận yêu cầu của máy khách sau đó chuyển cho tiến trình khác tiếp tục xử lý dịch vụ.

Một vấn đề khác cần phải tính đến khi thiết kế phần mềm trên máy chủ là vấn đề làm thế nào máy chủ có thể ngừng khi chưa hoàn thành yêu cầu xử lý dịch vụ. Ví dụ trường hợp máy khách đột ngột hủy trong khi máy chủ đang thực thi yêu cầu, khi đó kết nối giữa máy khách và máy chủ sẽ bị hủy bỏ, máy chủ sẽ chờ một khoảng thời gian nhất định sau đó sẽ hủy bỏ liên kết. Tuy nhiên, giải pháp này sẽ không tốt trong trường hợp liên kết giữa máy khách và máy chủ bị gián đoạn do nguyên nhân khách quan (chất lượng đường truyền kém...), giải pháp tốt hơn sẽ là cung cấp báo hiệu kênh ngoài (out-band)  cho liên kết giữa máy khách và máy chủ hoặc thiết kế giao thức có khả năng điều khiển tương tác. Điểm cuối cùng trong thiết kế máy chủ là vấn đề có lưu vết trạng thái hay không? Nếu không lưu giữ thông tin trạng thái của máy khách thì máy chủ có thể tùy ý thay đổi trạng thái của mình mà không cần báo lại cho máy khách. Nếu lưu trạng thái của máy khách thì máy chủ không những không được phép tùy ý thay đổi trạng thái mà còn tăng dung lượng lưu trữ, do đó có thể dung hòa hai cách tiếp cận trên bằng cách lưu trạng thái của máy khách trong một khoảng thời gian nhất định.

5.4.2    Cụm máy chủ

Phần này sẽ thảo luận về vấn đề cách triển khai hệ thống điện toán cụm, đó là một trong ba dạng kiến trúc cơ bản của hệ thống phân tán, cách tổ chức cụm máy chủ  cũng là một trong những vấn đề cần phải giải quyết khi mở rộng qui mô hệ thống.

5.4.2.1     Các mô hình cài đặt

Cụm máy chủ là tập hợp các máy được kết nối qua mạng, trên mỗi máy chạy một hoặc nhiều tiến trình máy chủ. Thông thường cụm máy chủ được kết nối trong mạng nội bộ để bảo đảm băng thông đủ lớn nhằm mục đích giảm thiểu độ trễ khi trao đổi thông tin giữa các máy chủ trọng cụm.

Hình 5.10 Tổ chức cụm máy chủ ba bên

 

Cụm máy chủ được bố trí thành ba lớp: Lớp tiếp nhận yêu cầu, lớp xử lý nghiệp vụ và lớp lưu trữ dữ liệu. Việc phân cụm máy chủ không những làm tăng hiệu năng xử lý mà còn đảm bảo độ tin cậy cho hệ thống. Ví dụ tại lớp xử lý yêu cầu nghiệp vụ thì cần phải có những bộ vi xử lý tốc độ cao nhưng lớp lưu trữ dữ liệu thường đòi hỏi yêu cầu các bộ đọc ghi nhanh.

Hình 5.11 Định tuyến máy chủ phân tán

 

Nhược điểm cơ bản của mô hình cụm máy chủ nằm ở lớp tiếp nhận yêu cầu, nếu lớp này ngừng hoặc bị quá tải thì sẽ ảnh hưởng đến toàn bộ hệ thống. Một mô hình khác đưa ra là tổ chức các máy chủ phân tán. Thay vì chỉ có một thành phần tiếp nhận yêu cầu sẽ bố chí nhiều thành phần tiếp nhận yêu cầu, đây là mô hình đã áp dụng trong hệ thống dịch vụ tên miền. Mô hình này đòi hỏi phải cài đặt thêm bộ tối ưu hóa định tuyến nhằm tạo điều kiện cho các máy khách tìm được máy chủ dịch vụ một cách nhanh nhất. Ngoài ra, máy khách cũng phải được cấu hình để biết thông tin về các máy chủ tiếp nhận yêu cầu.

5.4.2.2     Quản lý cụm máy chủ

Người sử dụng luôn mong muốn công việc quản lý cụm máy chủ phải tương tự  như trên một máy tính. Thực tế cho thấy các thao tác quản lý cụm máy chủ phức tạp hơn nhiều, cách đơn giản nhất là mở rộng tính năng quản lý của một máy chủ, người sử dụng phải truy nhập từ xa vào mỗi máy và thực hiện các thao tác quản lý như trên một máy. Một giải pháp khác là xây dựng phần mềm cài đặt trên một máy quản trị, mỗi máy tính trong cụm được thể hiện bằng một nút và người dùng có thế thêm hoặc bớt bất kỳ mày chủ nào. Như vậy, thay vì phải truy nhập vào từng máy thì phần mềm quản lý sẽ thu thập thông tin từ mỗi máy chủ và cung cấp giao diện quản lý cho người sử dụng. Tuy nhiên giải pháp này chỉ phù hợp với mô hình nhỏ, vấn đề sẽ phức tạp hơn rất nhiều đối với cụm máy chủ có qui mô lớn, vì vậy giải pháp quản lý cụm máy chủ lớn vẫn đang tiếp tục nghiên cứu.

Giả sử cụm có N nút và xác suất  xảy ra lỗi trên mỗi nút là p, xác xuất m nút đồng thời xảy ra lỗi được tính theo công thức của lý thuyết xác suất thống kê như sau:

Ví dụ cụm máy chủ gồm N=1000 nút, xác suất xảy ra lỗi trên mỗi máy chủ là p=0.001, áp dụng công thức trên để tính xác suất không có máy nào bị lỗi sẽ cho kết quả như sau:

= 0.367695

5.5       Di  trú mã

Từ đầu chương trình chúng ta mới chỉ tập trung vào vấn đề trao đổi dữ liệu trong hệ thống phân tán mà chưa đề cập đến vấn đề di chuyển các thành phần khác của tiến trình. Để tăng hiệu suất và độ linh hoạt của hệ thống, đôi khi phải di chuyển di chuyển các chương trình hoặc đoạn mã chương trình, quá trình đó gọi là di trú mã.

5.5.1    Các giải pháp di trú mã

Thông thường, di trú mã trong các hệ thống phân tán thực hiện dưới dạng di trú tiến trình, toàn bộ  tiến trình được di chuyển từ máy này sang máy khác, đây là công việc đòi hỏi chi phí cao và phức tạp. Lý do phải di chuyển tiến trình vẫn là vấn đề hiệu năng của hệ thống, các yêu cầu xử lý cần phải được chuyển tới những máy ít tải hơn, tải ở đây được hiểu là tỉ lệ sử dụng CPU, RAM và một số yếu tố khác. Các thuật toán phân tải đưa ra quyết định liên quan đến vấn đề xác định và phân phối lại nhiệm vụ dựa trên số lượng bộ xử lý đóng vai trò quan trọng trong các hệ thống tính toán với tần suất lớn. Tuy nhiên, trong các hệ thống phân tán hiện đại, vấn đề truyền dữ liệu trên được coi trọng hơn việc tối ưu hóa khả năng tính toán. Ngoài ra, vì các lý do liên quan đến vấn đề nền tảng không thống nhất hoặc mạng máy tính mà quyết định di trú mã có tính chất định tính chứ không dựa trên các mô hình toán học. Ví dụ, nếu máy khách cần phải tải một lượng dữ liệu lớn từ máy chủ về để xử lý thì có thể di trú đoạn mã trên máy khách về máy chủ và khi đó máy khách chỉ nhận kết quả đã được tính toán trên tập dữ liệu máy khách yêu cầu. Ngược lại, đối với những trường hợp người dùng phải cung cấp thông tin để máy chủ xử lý, thao tác kiểm tra tính hợp lệ của thông tin đầu vào nên được thực hiện trên máy khách, như vậy không những giảm tải cho máy chủ mà còn giảm lượng thông tin lưu chuyển trên mạng.

Hình 5.12 Nguyên lý cấu hình động cho máy khách

 

Di trú mã cũng cần thiết trong các trường hợp xử lý song song, nhưng không phải trên một máy tính. Ví dụ, để thực hiện nhiệm vụ tìm kiếm thông tin trên mạng, người ta sử dụng một đoạn mã di trú gọi là Agent, đoạn mã này sẽ di chuyển từ trang này sang trang khác, khi dừng lại ở trang nào nó sẽ tiếp tục nhân bản đoạn mã đó. Ngoài ra, kỹ thuật di trú mã còn làm cho hệ thống phân tán linh hoạt hơn, ví dụ mô hình đa phương trong các ứng dụng khách/chủ. Di trú mã giữa các máy đòi hỏi hệ thống phân tán phải được cấu hình động. Ví dụ, giả sử máy chủ cung cấp giao diện truy nhập tập tin, nó phải xây dựng một giao thức riêng. Thông thường, máy khách sẽ dựa trên giao thức này để liên kết với các ứng dụng khác. Đây là giải pháp tĩnh, nó đòi hỏi phải xây dựng giao thức trước khi phát triển phần mềm trên máy khách. Có thể sử dụng giải pháp động bằng cách đặt các đoạn mã vào một kho lưu trữ, máy khách sẽ tải một đoạn mã cần thiết từ kho lưu trữ đó, sau một số bước khởi tạo sẽ kết nối đến máy chủ cung cấp dịch vụ.

Một tiến trình bao gồm phần mã chứa tập các lệnh của chương trình đang chạy, phần tài nguyên chứa các tham chiếu đến tất cả các tài nguyên bên ngoài mà tiến trình đang sử dụng và phần thực thi chứa các trạng thái hiện hành của tiến trình. Việc di trú mã được hiểu là di chuyển một phần hay toàn bộ tiến trình, người ta phân làm hai loại di trú yếu (Weak mobility) và di trú mạnh (Strong mobility). Di trú yếu chỉ truyền phần mã và một số các dữ liệu khởi động của tiến trình, một chương trình được truyền đi luôn được bắt đầu từ trạng thái khởi động và chỉ yêu cầu máy đích thực thi yêu cầu  đó. Di trú mạnh truyền cả phần mã và phần thực thi, tiến trình đang chạy có thể tạm dừng để chuyển đến một máy khác và tiếp tục thực hiện tiến trình đó, mô hình này khó thực hiện  hơn. Di trú được do gửi khởi sướng hoặc do bên nhận khởi sướng.

5.5.2    Di trú và tài nguyên cục bộ

Mô hình di trú mạnh đòi hỏi chú ý đặc biệt tới những tài nguyên tiến trình đang sử dụng. Ví dụ một tiến trình đang sử dụng một cổng nào đó, khi di trú sang máy khác đồng nghĩa với việc từ bỏ cổng đang sử dụng và đồng thời thiết lập cổng tương ứng trên máy mới. Có ba mức tham chiếu giữa tiến trình và tài nguyên: Mạnh, yếu và rất yếu. Ở mức thứ nhất, tiến trình tham chiếu tới tài nguyên thông qua định danh, ví dụ các tiến trình sử dụng đường dẫn URL. Mức thứ hai, tiến trình chỉ đòi hỏi giá trị của tài nguyên, ví dụ tiến trình sử dụng các thư viện lập trình. Mức thứ ba, tiến trình chỉ tham chiếu đến loại tài nguyên, ví dụ tham chiếu tới các thiết bị ngoại vi. Khi di trú mã thì chỉ có thể thay đổi tham chiếu đến tài nguyên mà không được phép thay đổi mức độ tham chiếu.

5.5.3    Di trú trong hệ thống không đồng nhất

Di trú mã trên các hệ thống đồng nhất sẽ không gặp những trở ngại lớn là do các máy tính cùng chạy trên một nền tảng phần cứng và hệ điều hành, vấn đề sẽ trở nên khó khăn hơn rất nhiều nếu hệ thống bao gồm các máy tính sử dụng nền tảng khác nhau. Ngoài ra, vấn đề ngôn ngữ lập trình cũng gây trở ngại lớn trong di trú mã, các ứng dụng thường được lập trình bằng các ngông ngữ lập trình bậc cao như Pascal, C hay Java... Để giảm thiểu sự phụ thuộc ngôn ngữ lập trình, một giải pháp đã được đề xuất đó là việc di trú không chỉ thực hiện với tiến trình mà thực hiện với toàn bộ môi trường tính toán, với đề xuất này việc di trú phải thực hiện ba bước:

1.      Chuyển các trang bộ nhớ sang máy mới và sẽ cập nhật lại những trang bị thay đổi trong quá trình di trú.

2.      Ngừng máy ảo, di trú bộ nhớ và khởi tạo máy ảo mới.

3.      Khởi tạo các tiến trình trên máy ảo mới và sao chép các trang bộ nhớ theo yêu cầu của tiến trình đó.


CHƯƠNG 6:                   QUẢN TRỊ GIAO TÁC VÀ ĐIỀU KHIỂN TƯƠNG TRANH

Dữ liệu trong hệ thống phân tán dữ liệu đó có thể được lưu trữ tại một hoặc nhiều vị trí khác nhau, các tiến trình truy xuất dữ liệu để thực hiện các công việc tính toán theo yêu cầu nghiệp vụ. Nếu nhiều tiến trình đồng thời truy xuất dữ liệu thì có thể dẫn tới hiện tượng tương tranh, hậu quả tất yếu sẽ làm suy giảm hiệu năng hệ thống và thậm chí có thể dẫn đến sai lệch thông tin. Điều khiển tương tranh là cơ chế cho phép nhiều giao tác thực hiện đồng thời mà không xảy ra sự tranh chấp giữa các giao tác. Giả sử tài khoản X muốn chuyển cho tài khoản Y một lượng tiền bằng Z% số dư tài khoản hiện hành của Y, theo nghiệp vụ ngân hàng, trước hết sẽ lấy số dư hiện nay của tài khoản Y nhân với tỉ lệ Z sẽ cho lượng tiền phải chuyển khoản, công việc còn lại chỉ là hai thao tác cập nhật số dư mới của các tài khoản Y và X. Đoạn mã chương trình sau minh họa một ví dụ về nghiệp vụ chuyển khoản trong ngân hàng để thực hiện nhiệm vụ trên:

MoneyTransfer(Accounts X, Accounts Y, float Z )

{

    float Balance= Y.GetBalance();

         float Trans= Balance/Z;

Y.SetBalance(Balance +Trans);

X.Withdraw(Trans);        

}

Ví dụ ba tài khoản A, B và C có giá trị lần lượt là $100, $200 và $300, A và C cùng chuyển cho B  số tiền bằng 10%  số dư tài khoản của B, đoạn mã chương trình trên sẽ thực hiện như sau.

A chuyển cho B

C chuyển cho B

MoneyTransfer(A,B,0.1)

MoneyTransfer(C,B,0.1)

float Balance= B.GetBalance();

float Trans= Balance/0.1;

B.SetBalance(Balance+Trans);

A.Withdraw(Trans);

float Balance= B.GetBalance();

float Trans= Balance/0.1;

B.SetBalance(Balance+Trans);

C.Withdraw(Trans);

 

Hai giao tác trên được gửi đến máy chủ cùng một lúc, vì vậy các chỉ thị lệnh sẽ lần lượt được thực hiện  và một trong những khả năng có thể xảy ra như sau:

float Balance= B.GetBalance();//200$

float Trans= Balance/0.1;     // 20$

 

 

B.SetBalance(Balance+Trans);  //220$

A.Withdraw(Trans);            // 80$

 

float Balance= B.GetBalance();  //200$

float Trans= Balance/0.1;       // 20$

B.SetBalance(Trans);            //220$

 

 

C.Withdraw(Trans);              //280$

 

Số dư tài khoản B là 220$ trong khi mỗi tài khoản A và C đều bị trừ 20$, số dư tài khoản B đúng ra phải là 242$, như vậy thủ tục tính toán không những đã thực hiện sai nghiệp vụ mà còn gây thất thoát cho tài khoản A hoặc C, hiện tượng này gọi là mất mát cập nhật. Tương tự như vậy, giả sử A chuyển cho B 50$, tại thời điểm giao dịch nhân viên ngân hàng thực hiện thao tác kiểm tra số dư của tất cả các tài khoản, các thao tác được thực hiện như sau:

A chuyển cho B 10$

Nhân viên kiểm tra số dư

A.Withdraw(10);

B.Deposit(10);

float Total=A.GetBalance();

Total= Total+ B.GetBalance();

 

Tình huống thực hiện trên máy chủ như sau:

A.Withdraw(10);    // 100$

 

 

B.Deposit(10);     // 210$

 

float Total=A.GetBalance();    //  90$

Total= Total+ B.GetBalance();  // 290$

 

Hiện tượng đọc kết quả không đồng nhất đã xảy ra trong trường hợp này, tổng số dư phải là 300$ chứ không phải 290$ như kết quả chương trình đã đưa ra. Nguyên nhân của hai lỗi trên được xác định là do trình tự thực hiện các thao tác không theo mong muốn và xung đột đã xảy ra trong khi thực hiện các giao tác. Hai giao tác được gọi là xung đột nếu kết quả tổ hợp thực hiện các lệnh của chúng phụ thuộc vào thứ tự thực hiện, do đó cần phải xác định các lệnh có thể gây ra xung đột và phải tuần tự hóa thứ tự thực hiện của chúng.

6.1       Khái niệm giao tác

Giao tác gồm một hoặc nhiều câu lệnh truy xuất dữ liệu và chúng được thực hiện như một đơn vị thống nhất, nghĩa là không thể thêm hay bớt bất kỳ câu lệnh nào. Giao tác được chia thành giao tác phẳng, giao tác lồng ghép và giao tác phân tán. Giao tác có thể gồm nhiều câu lệnh đọc/ghi dữ liệu và phải đảm bảo bốn tính chất sau:

-         Tính chất nguyên tử (Atomic): Đối với thế giới bên ngoài thì giao tác không thể chia nhỏ hơn được, các lệnh trong giao tác đều được thực hiện hoặc không có lệnh nào được thực hiện. Tính nguyên tử đòi hỏi nếu một giao tác bị hủy giữa chừng thì kết quả của các lệnh đã thực hiện sẽ bị hủy bỏ.

-         Tính chất nhất quán (Consistent): giao tác không xâm phạm tính chất bất biến của hệ thống, nghĩa là luôn phải đảm bảo hệ thống toàn vẹn.

-         Tính chất cô lập (Isolated): Khi có nhiều giao tác đồng thời thực hiện thì mỗi giao tác sẽ hoạt động độc lập và  không làm ảnh hưởng đến các giao tác khác.

-         Tính chất bền vững (Durable): Khi giao tác đã cam kết thì các thay đổi đối với nó không phải là tạm thời mà là những thay đổi bền vững, nếu không cam kết thì sẽ tự động phục hồi, coi như chưa từng thực hiện các lệnh trong giao tác.

6.1.1       Giao tác phẳng

Một giao tác thỏa mãn bốn tính trên gọi là giao tác phẳng, hạn chế chính của giao tác phẳng là chúng không cho phép tách riêng các kết quả được cam kết hay hủy bỏ. Giao tác bắt đầu bằng lệnh mở giao tác, tiếp theo là các chuỗi các lệnh thao tác với dữ liệu và kết thúc đóng giao tác bằng lệnh cam kết (commit) hoặc hủy bỏ (abort, rollback).

Hình 6.1 Các trường hợp thực hiện giao tác phẳng

 

6.1.2       Các giao tác lồng nhau

Giao tác lồng nhau được cấu thành từ một số giao tác con, nói cách khác là trong giao tác lại gồm nhiều giao tác con, mỗi giao tác con cũng có thể thực thi một hay nhiều giao tác con của chính nó.

 

Hình 6.2 Cấu trúc giao tác lồng nhau

 

Trong giao tác lồng nhau, các giao tác con trên cùng một mức có thể chạy đồng thời với nhau, các lệnh cam kết hoặc hủy bỏ của các giao tác con hoàn toàn độc lập với nhau.

6.1.3       Giao tác phân tán

Giao tác phân tán là những giao tác thực hiện thao tác với dữ liệu được đặt trên nhiều máy tính khác nhau, nó phải đảm bảo tính thống nhất trong việc thực hiện các thao tác trên tất cả các máy tính.

6.2       Các phương pháp điều khiển tương tranh

Có ba cách tiếp cận giải quyết vấn đề tương tranh: Điều khiển tương tranh bi quan, điều khiển tương tranh lạc quan và điều khiển tương tranh dựa trên nhãn thời gian. Hai cách tiếp cận đầu tiên trái ngược nhau về quan điểm, điều khiển tương tranh bi quan nhìn nhận hệ thống luôn tiềm ẩn tương tranh, trong khi đó điều khiển tương tranh lạc quan nhìn nhận không xảy ra tương tranh và khi nào xảy ra thì mới giải quyết. Cách sử dụng khóa là một cách tiếp cận điển hình về điều khiển tương tranh bi quan, nhược điểm cơ bản của nó là tăng tải xử lý cho hệ thống.

6.2.1       Điều khiển tương tranh bi quan

Một phương pháp để đảm bảo tính tuần tự là yêu cầu việc truy xuất đến hạng mục dữ liệu được tiến hành theo kiểu loại trừ tương hỗ, nghĩa là trong khi một giao dịch đang truy xuất một mục dữ liệu thì không một giao tác nào khác có thể sửa đổi mục dữ liệu này. Phưong pháp chung nhất được dùng để thực thi yêu cầu này là cho phép một giao tác truy xuất một mục dữ liệu khi và chỉ khi nó đang giữ khóa trên mục dữ liệu đó. Tư tưởng chính của các thuật toán này là các thao tác trên một đơn vị dữ liệu nếu có xung đột thì tại một thời điểm chỉ cho phép một giao tác thực hiện, điều này được thực hiện dựa trên cơ chế khóa.

Để truy xuất một mục dữ liệu, giao tác Ti trước tiên phải khóa mục dữ liệu này và khi thực hiện xong thì phải giải phóng khóa. Nếu mục dữ liệu này đã bị khóa bởi một giao tác khác và khóa đó không tương thích thì bộ điều khiển tương tranh sẽ không cấp khóa cho đến khi khóa này được giải phóng. Một giao tác cần thiết phải giữ một khóa trên một mục dữ liệu chừng nào mà nó còn truy xuất mục này. Hơn nữa, đối với một giao tác việc tháo khóa ngay sau khi truy xuất cuối cùng đến mục dữ liệu không luôn luôn là điều mong muốn vì như vậy tính khả tuần tự có thể không được đảm bảo cho đến khi tất cả các khóa không tương thích do các giao tác khác giải phóng. Sử dụng khóa có thể dẫn đến trạng thái khóa chết (deadlock), đó là trạng thái mỗi thành viên của nhóm các giao tác phải chờ lẫn nhau giải phóng khóa. Có thể sử dụng đồ thị wait-for  để thể hiện các quan hệ chờ giữa các giao tác tương tranh tại máy chủ. Để hạn chế hiện tượng khóa chết có thể áp dụng các biện pháp sau:

-         Khi bắt đầu giao tác sử dụng khóa tất cả các mục dữ liệu.

-         Mỗi giao tác yêu cầu khóa trên các mục dữ liệu theo thứ tự đã định nghĩa trước.

-         Mỗi khóa có khoảng thời gian giới hạn, sau thời gian đó sẽ không được bảo vệ.

6.2.2       Điều khiển tương tranh lạc quan

Điều khiển tương tranh lạc quan cho phép các giao tác được phép tiếp tục nếu không có xung đột với các giao tác khác, nếu phát hiện xung đột thì sẽ hủy bỏ giao tác nào đó. Mỗi giao tác gồm ba pha:

-         Pha đọc: sử dụng bản tạm thời cho mỗi mục dữ liệu được cập nhật

-         Pha phê chuẩn: Kiểm tra xem có xung đột hay không

-         Pha ghi: Nếu được phê chuẩn không có xung đột thì chuyển bản dữ liệu tạm thời thành vĩnh viễn

Để được phê chuẩn, mỗi giao tác được gán số tuần tự khi bước vào pha phê chuẩn, giao tác luôn luôn kết thúc pha đọc của mình sau tất cả các giao tác có số thứ tự thấp hơn. Các pha phê chuẩn có thể chồng nhau nhưng số hiệu phải được gán tuần tự, tất cả các pha ghi được thực hiện tuần tự theo số hiệu đã được gán và không tái sử dụng số thứ tự đã gán cho giao tác, như vậy không cần kiểm tra xung đột ghi-ghi. Điều khiển tương tranh lạc quan sử dụng hai dạng phê chuẩn: Phê chuẩn ngược và phê chuẩn xuôi. Phê chuẩn ngược kiểm tra với các giao tác đã bước vào giai đoạn phê chuẩn trước nó trong khi đó phê chuẩn xuôi lại kiểm tra với các giao tác sau nhưng vẫn đang hoạt động.

6.2.3       Điều khiển tương tranh dựa trên nhãn thời gian

Một cách tiếp cận khác trong điều khiển tương tranh là gán nhãn thời gian cho các giao tác, mỗi giao tác được gán nhãn thời gian duy nhất khi bắt đầu. Mỗi lệnh mang nhãn thời gian của giao tác đã được cấp phát và được phê chuẩn khi thực hiện, nếu câu lệnh không được thực hiện thì giao tác sẽ bị hủy bỏ ngay lập tức. Sử dụng giải thuật gán nhãn thời gian Lamport sẽ đảm bảo cho mỗi thao tác được gán một nhãn thời gian duy nhất và như vậy sẽ không còn hiện tượng tương tranh, tuy nhiên cần phải có một thành phần điều phối để ưu tiên những giao tác có thời gian thực hiện nhanh và thường xuyên hơn.


CHƯƠNG 7:                   PHỤC HỒI VÀ TÍNH CHỊU LỖI

Lỗi có thể xảy ra trong bất kỳ hệ thống thông tin nào, đặc biệt trong môi trường phân tán lỗi của bất kỳ một thành phần nào cũng có thể ảnh hưởng đến toàn bộ hệ thống. Nếu hệ thống phụ thuộc hoàn toàn vào một máy chủ, lỗi xảy ra trên máy chủ đó sẽ ảnh hưởng đến toàn bộ hệ thống. Một trong những mục tiêu quan trọng khi thiết kế hệ thống phân tán là phải xây dựng hệ thống sao cho lỗi xảy ra trên một máy chủ nào đó sẽ ảnh hưởng ít nhất đến vận hành chung của hệ thống.

7.1       Giới thiệu tính chịu lỗi

Trong hệ thống phân tán, lỗi có thể xảy ra trên bất cứ thành phần nào, dù cho đó lỗi máy chủ hay lỗi mạng thì đều làm suy giảm hiệu năng và thậm chí làm gián đoạn dịch của hệ thống. Một yêu cầu quan trọng khi xây dựng hệ thống phân tán là phải lường trước được các lỗi có thể xảy ra và sẵn sàng phương án xử lý sao cho tối thiểu hóa các ảnh hưởng của nó đến hệ thống. Nói cách khác, khi có lỗi xảy ra thì hệ thống vẫn vận hành theo cách có thể chấp nhận được, nghĩa là hệ thống phải có khả năng chịu được lỗi. Chủ đề về tính chịu lỗi của hệ thống phân tán đã được nghiên cứu khá nhiều trong khoa học máy tính.

7.1.1    Khái niệm tính chịu lỗi

Tính chịu lỗi của một hệ thống liên quan mật thiết tới khái niệm tính tin cậy của hệ thống, một hệ thống được coi là có khả năng chịu lỗi nếu đáp ứng được các tiêu chí sau:

-         Khả năng sẵn sàng phục vụ của hệ thống

-         Độ tin cậy của hệ thống

-         Độ an toàn của hệ thống

-         Khả năng bảo trì hệ thống

Khả năng sẵn sàng phục vụ của hệ thống thể hiện ở thời gian đáp ứng yêu cầu của mỗi dịch vụ, trong trường hợp lý tưởng nó phải được thực hiện theo thời gian thực. Độ tin cậy của hệ thống liên quan tới tính chính xác của thông tin mà không phụ thuộc vào yếu tố thời gian. Độ an toàn của hệ thống thể hiện ở khả năng bảo đảm an toàn cho dữ liệu ngay cả khi có những sự cố lớn. Khả năng bảo trì hệ thống thể hiện ở khả năng phục hồi hệ thống sau khi xảy ra lỗi, nó phải được thực hiện một cách đơn giản và trong thời gian nhanh nhất và tổn thất thông tin ở mức thấp nhất.

7.1.2    Phân loại lỗi

Một hệ thống bị coi là lỗi nếu nó không cung cấp chính xác các dịch vụ như đã thiết kế. Nếu coi hệ thống phân tán là tập hợp máy chủ trao đổi thông tin với nhau và với các máy khách thì lỗi có thể xảy ra ở trên các máy chủ hoặc trên hạ tầng mạng. Việc vận hành sai qui cách cũng có thể gây ra lỗi, nếu một máy chủ hoạt động phụ thuộc vào máy chủ khác thì nó cũng sẽ bị ảnh hưởng nếu lỗi xảy ra trên máy chủ khác. Xét về tần suất, lỗi được phân chia thành ba loại sau:

-         Lỗi nhất thời: Là loại lỗi xảy ra một lần sau đó không xuất hiện lại.

-         Lỗi lặp: Là loại lỗi mà chúng xuất hiện nhiều lần, có thể theo chu kỳ hoặc không. Lỗi này thường gây ra các hậu quả nghiêm  trọng vì chúng rất khó xác định được.

-         Lỗi lâu dài: Là loại lỗi vẫn tồn tại ngay cả khi thành phần gây lỗi đó đã được sửa chữa.

Xét về mức độ ảnh hưởng, lỗi được phân thành năm loại sau:

-         Máy chủ bị lỗi nghiêm trọng : Máy chủ có thể bị treo và dừng mọi hoạt động cung cấp dịch vụ, cách duy nhất để giải quyết vấn đề này là khởi động lại máy chủ.

-         Máy chủ xử lý lỗi: Máy chủ không nhận được yêu cầu từ máy khách, nhận được yêu cầu nhưng không thể trả lời hoặc không thể trả về kết quả xử lý cho máy khách. Trong trường hợp này cần phải kiểm tra kết nối giữa máy khách và máy chủ, thường thường đó là các lỗi mạng.

-         Lỗi thời gian: Máy chủ không đáp ứng được thời gian xử lý yêu cầu của máy khách.

-         Lỗi kết quả xử lý: Thông tin trả về của máy chủ không chính xác, có thể là giá trị sai.

-         Lỗi không xác định: Máy chủ trả về các giá trị không mong muốn và những giá trị đó chưa từng xảy ra, việc xác định nguyên nhân và biện pháp xử lý các lỗi này rất khó.

7.2       Các biện pháp đảm bảo tính chịu lỗi

7.2.1    Che giấu lỗi bằng biện pháp dư thừa

Một hệ thống chịu được lỗi thì cần phải có khả năng che giấu được các lỗi, nói cách khác người sử dụng không hề biết hoặc ít biết về sự cố đối với mạng dịch vụ. Một phương pháp phổ biến thường được áp dụng trong các hệ thống phân tán là xây dựng các thành phần dư thừa:

         Dư thừa thông tin : bổ sung thêm các bit dư thừa để phát hiện lỗi và phục hồi lỗi. Ví dụ trong việc truyền dữ liệu thường thêm vào các bit kiểm tra chẵn lẻ, mã Haming, CRC… để phát hiện lỗi và phục hồi lỗi.

         Dư thừa thời gian: khi một hoạt động đã được thực hiện, nếu dư thừa thời gian nó có thể được thực hiện lại. Kĩ thuật dư thừa thời gian phù hợp khi lỗi là nhất thời và lỗi chập chờn. Có thể sửa lỗi bằng cách thực hiện lại các giao tác bị lỗi, Tuy nhiên phải chú ý tính đúng đắn đối với các thao tác thực hiện theo thời gian thực.

         Dư thừa vật lý: bổ sung thêm tài nguyên vật lý, thay vì sử dụng một thiết bị thì sử dụng thêm nhiều thiết bị khác để dự phòng.

 

 

Hình  7.1 Xây dựng hệ thống dư thừa theo kiểu chuyển mạch

 

Hình 7.1 minh họa kỹ thuật dư thừa theo tương tự như hệ thống chuyển mạch, bình thường hệ thống chỉ bao gồm 3 thành phần chính A, B, C. Để đảm bảo khả năng chịu lỗi, chúng ta thêm các thành phần Ai, Bi, Ci tương ứng với A, B, C và duy trì ở trạng thái dự phòng. Khi có lỗi xảy ra, hệ thống sẽ tự động chuyển đến  một trong các thành phần dư thừa tương ứng, sau khi khắc phục xong lỗi, hệ thống sẽ chuyển về xử lý trên các thành phần chính của hệ thống.

7.2.2       Tiến trình bền bỉ

Vấn đề cơ bản trong việc cung cấp tính năng chịu lỗi trong hệ thống phân tán là việc phòng chống và khắc phục lỗi. Có thể xây dựng hệ thống chịu lỗi bằng phương pháp dư thừa vật lý, tuy nhiên giải pháp này khá tốn kém, phần này sẽ đề cập tới một số giải pháp mềm để giải quyết vấn đề lỗi trong các hệ thống phân tán.

7.2.2.1     Lựa chọn mô hình cài đặt

Giải pháp chính trong việc chống lỗi là tổ chức một số tiến trình giống nhau thành các nhóm xử lý, khi có thông điệp được gửi tới thì tất cả các thành viên trong nhóm đều nhận được thông điệp đó. Mỗi nhóm có thể được tổ chức thep mô hình ngang hàng hoặc mô hình phân cấp, một tiến trình có thể là thành viên của một số nhóm khác nhau.

Hình  7.2       Nhóm các tiến trình trong hệ thống phân tán

 

Vấn đề mới nảy sinh đối với loại thiết kế này là việc quản lý và phối hợp hoạt động giữa các tiến trình. Hình 7.2 minh họa hai giải pháp tổ chức nhóm tiến trình trong các hệ thống phân tán, việc tổ chức này hoàn toàn phụ thuộc vào các thuật toán xử lý bên trong mỗi tiến trình. Với mô hình ngang hàng, tất cả các thành viên đều nhận được yêu cầu gửi đến nhưng chỉ có một thành viên được phép xử lý, như vậy các thành viên trong nhóm phải thực hiện quá trình bầu chọn. Với mô hình phân cấp, thành viên điều phối sẽ quyết định tiến trình nào được phép thực hiệu yêu cầu, tuy nhiên mô hình này lại quay trở lại mô hình xử lý tập trung nhưng đảm bảo tính mềm dẻo hơn.

7.2.2.2     Che giấu lỗi và nhân bản

Che giấu lỗi trong hệ thống phân tán tập trung vào trường hợp có tiến trình bị lỗi, tuy nhiên trước hết cần phải xem xét các  trường hợp lỗi truyền tin. Sử dụng nhóm tiến trình cũng là một trong các biện pháp che giấu lỗi, nhóm các tiến trình giống nhau sẽ che giấu một tiến trình nào đó bị lỗi. Nhân bản một tiến trình sau đó gộp chúng thành một nhóm, có hai phương pháp nhân bản: giao thức dựa trên thành phần chính và giao thức dựa trên ghi nhân bản. Trong phương pháp che giấu lỗi dựa trên thành phần chính, các tiến trình trong nhóm tổ chức theo mô hình phân cấp. Một tiến trình đóng vai trò tiến trình chính có nhiệm vụ điều phối tất cả các thao tác ghi. Nếu tiến trình chính của nhóm dừng hoạt động thì các tiến trình sao lưu sẽ thực hiện giải thuật bầu chọn để lựa chọn tiến trình chính mới. Nếu dựa trên ghi nhân bản thì các tiến trình trong nhóm tổ chức theo mô hình nhóm ngang hàng, vấn đề nằm ở câu hỏi cần nhân bản với số lượng là bao nhiêu.

7.2.2.3     Đồng thuận trong các hệ thống lỗi

Tổ chức các tiến trình nhân bản thành nhóm làm tăng khả năng chịu lỗi, nếu máy khách có thể dựa trên quyết định của nó thông qua cơ chế bầu chọn thì vẫn có thể chấp nhận kết quả sai lệch của k trong số 2k+1 tiến trình. Vấn đề trở nên phức tạp nếu muốn các tiến trình trong nhóm đạt được sự đồng thuận trong một số trường hợp như bầu chọn thành viên điều phối, ra quyết định khẳng định trong các giao tác phân tán, phân chia công việc cho các tiến trình thực thi, thực hiện đồng bộ … Nếu các tiến trình và truyền thông đều ở trạng thái hoạt động tốt thì sẽ không có vấn đề gì xảy ra, ngược lại sẽ nảy sinh vấn đề đạt được sự đồng thuận giữa các tiến trình. Mục đích chung của thuật toán đồng thuận phân tán là để tất cả các tiến trình không lỗi đạt được sự đồng thuận về một vấn đề nào đó và đạt được sự đồng thuận sau một số bước hữu hạn. Vấn đề trở nên phức tạp hơn bởi thực tế các giả định khác nhau về hệ thống nền tảng đòi hỏi các giải pháp khác nhau, Turek và Shasha đã chỉ ra bốn trường hợp sau:

1.      Hệ thống đồng bộ với hệ thống không đồng bộ, một hệ thống được coi là đồng bộ khi và chỉ khi các tiến trình vận hành trong chế độ theo sát nhau. Về hình thức, phải có hằng số s>=1, nếu bất kỳ tiến trình nào thực hiện s+1 bước thì tiến trình khác cũng phải thực hiện ít nhất một bước, ngược lại sẽ là không đồng bộ.

2.      Trễ truyền thông bị giới hạn hay không giới hạn, độ trễ bị giới hạn khi và chỉ khi bất kỳ một thông điệp nào cũng sẽ được phân phát trong một khoảng thời gian nhất định.

3.      Phân phát thông điệp theo thứ tự hay không theo thứ tự, phân phát thông điệp theo thứ tự nghĩa là bên nhận phải nhận được các thống điệp đúng theo thứ tự bên gửi đã phát đi. Thậm chí phân phát thông điệp theo thứ tự còn phải tính đến sự nhất quán thứ tự các thông điệp trên mỗi tiến trình của hệ thống phân tán.

4.      Truyền thông điệp theo phương pháp điểm – điểm hay truyền theo nhóm.

Trên hình 7.3 các trường hợp có thể đạt được sự đồng thuận được đánh dấu X, tất cả những trường hợp khác đều không có giải pháp thực hiện, cần lưu ý rằng các tiến trình của hệ thống phân tán trong thực tế hầu hết đều vận hành theo phương thức không đồng bộ, truyền thông điểm điểm và có ràng buộc thời gian khi truyền thông điệp. Từ kết quả trên hình vẽ 7.3 cho thấy hệ thống cần sử dụng phân phát thông điệp theo thứ tự và tin cậy như giao thức TCP đã cung cấp.

 

Thứ tự thông điệp

 

Không

Phương thức xử lý

Đồng bộ

 

 

X

 

Ràng buộc

Độ trễ truyền thông

 

 

X

 

Không đồng bộ

X

X

X

X

Không ràng buộc

 

 

X

X

 

Điểm – Điểm

Nhóm

Điểm – Điểm

Nhóm

 

Phương pháp truyền thông

Hình 7.3 Các trường hợp đạt được sự đồng thuận

Vấn đề trên đã được Lamport nghiên cứu và đưa ra bài toán đồng thuận phức tạp (Bazentine), đề cập đến nhiều cuộc chiến mà một số đội quân cần phải đạt được sự đồng thuận, ví dụ về quân số, trong khi phải đối mặt với những thông tin sai lệch. Trong ví dụ này ta coi các tiến trình vận hành theo phương thức đồng bộ, thông điệp truyền theo phương pháp điểm-điểm, có thứ tự và giới hạn thời gian truyền thông. Giả sử hệ thống gồm N tiến trình, mỗi tiến trình i cung cấp giá trị Vi cho các  tiến trình khác, mục tiêu cần đạt trong đồng thuận lỗi sẽ được thực hiện bằng cách cho phép mỗi tiến trình xây dựng vector V gồm N phần tử với V[i]=Vi nếu tiến trình i không lỗi và V[i] không xác định nếu tiến trình i bị lỗi. Quá trình tiến tới sự đồng thuận sẽ được thực hiện theo bốn bước sau:

1.      Mỗi tiến trình i không lỗi gửi giá trị Vi cho các tiến trình khác sử dụng phương pháp truyền thông điểm-điểm tin cậy, tiến trình lỗi gửi giá trị bất kỳ.

2.      Kết quả nhận được từ bước 1 sẽ tập hợp lại thành vector V.

3.      Mỗi tiến trình gửi vector V của bước 2 cho các tiến trình khác.

4.      Mỗi tiến trình kiểm tra phần tử thứ i trong các Vector nhận được ở bước 3, nếu kết quả kiểm tra chiếm đa số thì đặt giá trị vào Vector kết quả đồng thuận, nếu không thì đặt giá trị không xác định UNKNOWN.

Ví dụ, hệ thống gồm bốn thành viên như trên hình 7.4 (a), các tiến trình 1, 2, 4 đều gửi giá trị tương ứng 1, 2 và 4 cho các tiến trình khác, tiến trình số 3 bị lỗi nên gửi các giá trị bất kỳ x, y và z cho các tiến trình 1, 2 và 4. Các thành viên khác trong hệ thống cần phải đảm bảo sự đồng thuận về việc tiến trình 3 có thực sự bị lỗi hay không. Kết quả thực hiện ở bước 2, mỗi tiến trình sẽ lưu giữ giá trị vector lần lượt là (1,2,x,4), (1,2,y,4), (1,2,3,4), (1,2,z,4). Thực hiện bước 3, các tiến trình 1, 2 và 4 gửi giá trị vector đã nhận được ở bước 2 cho các tiến trình khác, trong khi đó tiến trình 3 tiếp tục gửi những giá trị không xác định, kết quả là các tiến trình 1, 2 và 4 sẽ nhận được các vector như hình 7.4 (c).

1 (1,2,x,4)

2 (1,2,y,4)

3 (1,2,3,4)

4 (1,2,z,4)

1

2

4

(1,2,y,4)

(a,b,c,d)

(1,2,z,4)

(1,2,x,4)

(e,f,g,h)

(1,2,z,4)

(1,2,x,4)

(1,2,y,4)

(i,j,k,l)

 

(a) Mỗi tiến trình gửi giá trị của chúng cho các tiến trình khác

(b) Mỗi tiến trình xây dựng Vector

(c) Mỗi tiến trình lưu giữ các vector nhận được ở bước 3

Hình 7.4 Thuật toán đồng thuận phân tán

 

Tại bước 4, mỗi tiến trình sẽ tự tổng hợp cho kết quả cuối cùng cho mỗi phần tử thứ i của các vector nhận được trong bước thứ ba, nếu giá trị nào chiếm đa số thì sẽ đánh dấu giá trị đó trong phần tử tương ứng, ngược lại sẽ điền giá trị không xác định.  Giá trị cuối cùng trong các tiến trình 1, 2 và 4 đều có giá trị là  (1,2,Unknow,4), như vậy các tiến trình 1, 2 và 4 có thể đảm bảo chắc chắn các tiến trình số 1, 2, 4 không bị lỗi nhưng lại không thể đảm bảo tiến trình số 3 có bị lỗi hay không.

1 (1,2,x)

2 (1,2,y)

3 (1,2,3)

1

2

(1,2,y)

(a,b,c)

(1,2,x)

(d,e,f)

(a) Mỗi tiến trình gửi giá trị của chúng cho các tiến trình khác

(b) Mỗi tiến trình xây dựng Vector

(c) Mỗi tiến trình lưu giữ các vector nhận được ở bước 3

Hình 7.5 Không xác định được sự đồng thuận

 

Xét lại ví dụ trên trong trường hợp có 3 tiến trình và 1 tiến trình bị lỗi, áp dụng thuật toán trên sẽ cho kết quả như trên hình 7.5, kết quả cuối cùng sau khi hoàn bước 3 không có bất kỳ phần tử nào chiếm đa số, vì vậy các tiến trình không lỗi 1 và 2 đều không đạt được sự đồng thuận. Lamport đã chứng minh rằng, một hệ thống có k tiến trình lỗi thì phải có 2k+1 tiến trình không lỗi, như vậy tổng số tiến trình phải là 3k+1, nói cách khác phải có trên 2/3 số tiến trình không lỗi.

Một cách khác nhìn nhận vấn đề trên, hệ thống cần phải đạt được đa số phiếu bầu của các tiến trình không lỗi bất chấp sự hiện diện của các tiến trình lỗi. Vói k tiến trình lỗi, hệ thống cần phải được đảm bảo rằng bầu chọn của chúng, cùng với bất kỳ tiến trình không lỗi nào bị nhầm lẫn vì các tiến trình lỗi, đều không trái với đa số bầu chọn của các tiến trình không lỗi. Với 2k + 1 tiến trình không có lỗi, điều này có thể đạt được bằng cách yêu cầu tiến tới đồng thuận chỉ khi nào có trên hai phần ba số phiếu bầu giống nhau. Nói cách khác, nếu trên hai phần ba tiến trình đồng thuận về
cùng một quyết định, quyết định này tương ứng với đa số phiếu của nhóm các tiến trình không lỗi. Tuy nhiên, tiến tới sự đồng thuận có thể sẽ còn tồi tệ hơn,
Fischer đã chứng minh rằng, trong các hệ thống phân tán mà các thông điệp không đảm bảo được phân phát trong một khoảng thời gian hữu hạn thì đồng thuận cũng không thể đạt được ngay cả khi chi có một tiến trình bị lỗi, mặc dù tiến trình đó bị lỗi thầm lặng, những hệ thống  này làm chậm các tiến trình một cách tùy tiện không thể phân biệt với các tiến trình bị lỗi sụp đổ. Nhiều kết quả lý thuyết khác cũng chỉ ra khi nào có thể đạt được sự đồng thuận, ví dụ các kết quả nghiên cứu của Barborak, Turek và Shasha. Ngoài mô hình đồng thuận đã đề cập trên còn phải kể tới vấn đề đồng thuận trong các môi trường cộng tác, điều này rất khó đạt được trong các hệ thống thuộc về nhiều miền quản lý khác nhau, Aiyer đã đề cập tới vấn đề này trong các bài viết về tính chịu lỗi BAR (Byzantine, Altruism, Rationality).

7.2.2.4     Phát hiện lỗi

Phát hiện lỗi là một trong những nhiệm vụ nền tảng để đảm bảo khả năng chịu lỗi trong các hệ thống phân tán,  các tiến trình trong nhòm phải có khả năng phát hiện kịp thời những tiến trình nào đang bị lỗi hoặc có khả năng gây ra lỗi, từ đó thông báo đến các thành phần khác có liên quan hoặc thông báo cho người quản trị hệ thống. Việc phát hiện lỗi có thể dựa trên các thông tin trạng thái, ngưỡng giới hạn hoặc các tiến trình sử dụng kỹ thuật trí tuệ nhân tạo, khi có lỗi xảy ra cần phải thực hiện các thao tác trong qui trình sửa lỗi. Để phát hiện lỗi của các tiến trình, chỉ cần sử dụng hai cơ chế chủ động hoặc thụ động, trong cơ chế chủ động các tiến trình trong nhóm gửi cho nhau thông điệp “IS ALIVE” và tất nhiên sẽ chờ đợi phản hồi từ các tiến trình khác. Với cơ chế thụ động, mỗi tiến trình sẽ chờ  nhận thông điệp từ các tiến tình khác, trong thực tế thường dùng cơ chế chủ động.

Đã có nhiều công trình nghiên cứu lý thuyết phát hiện lỗi, tựu trung đều sử dụng cơ chế thời gian quá hạn để kiểm tra xem một tiến trình có bị lỗi hay không. Cơ chế này có hai điểm yếu cơ bản, thứ nhất mạng không đáng tin cậy và thứ hai thời gian quá hạn chỉ là dữ liệu thô. Khi gửi thông điệp đến tiến trình khác, không thể vội vàng kết luận tiến trình đó đã bị lỗi chỉ vì lý do không nhận được phản hồi. Mỗi tiến trình cần thường xuyên trao đổi thông tin với các tiến trình có liên quan, phải phân biệt được lỗi mạng hay lỗi trên mỗi nút mạng, bất kỳ thành viên nào phát hiện được lỗi thì phải thông báo tới các nút có liên quan.

7.2.3       Truyền thông khách/chủ tin cậy

Trong nhiều trường hợp tính chịu lỗi trong hệ thống phân tán tập trung vào các tiến trình lỗi, tuy nhiên cũng cần phải chú ý đến các lỗi truyền thông. Lỗi truyền thông có thể do mất kênh truyền, thất lạc thông tin, quá thời gian, lặp thông điệp…, trong thực tế khi xây dựng các kênh truyền thông tin cậy tiêu điểm tập trung vào việc che giấu lỗi mất kênh truyền và thất lạc thông tin. Để khắc phục lỗi truyền thông, người ta thường sử dụng phương pháp truyền thông tin điểm-điểm  hoặc truyền thông theo nhóm, truyền thông tin cậy điểm-điểm dựa trên các giao thức truyền tin cậy, ví dụ sử dụng giao thức TCP.

7.2.3.1     Truyền thông điểm – điểm

Trong hệ phân tán, truyền thông điểm - điểm tin cậy được thiết lập bằng cách sử dụng các giao thức truyền thông tầng vận tải tin cậy, ví dụ giao thức TCP. Giao thức TCP che giấu được lỗi bỏ sót bằng cơ chế số tuần tự của đoạn tin và thực hiện truyền lại, những lỗi như vậy hoàn toàn trong suốt đối với máy khách. Tuy nhiên, sử dụng giao thức truyền thông tin cậy không khắc phục được lỗi sụp đổ, lỗi này xuất hiện khi liên kết TCP đột ngột bị ngắt và các thông điệp không thể tiếp tục gửi qua kênh truyền, thông thường máy khách sẽ nhận được thông báo lỗi kênh truyền. Khi hệ thống gặp lỗi sụp đổ thì liên kết TCP sẽ bị hủy bỏ, cách duy nhất là hệ thống tự động tạo một liên kết mới bằng cách gửi yêu cầu thiết lập lại liên kết.

7.2.3.2     Các tình huống lỗi khi thủ tục từ xa

Gọi thủ tục từ xa là một trong những phương pháp sử dụng phổ biến trong mô hình truyền thông khách/chủ, nó che giấu quá trình truyền thông bằng cách làm cho việc gọi thủ tục từ xa giống như gọi trên máy cục bộ. Nếu máy khách, máy chủ và môi trường mạng vận hành bình thường thì gọi thủ tục từ xa thực hiện rất tốt vai trò của nó, tuy nhiên vấn đề sẽ phát sinh khi một trong ba thành phần trên gặp lỗi và tất nhiên việc che giấu lỗi sẽ không thể thực hiện được nữa, gọi thủ tục từ xa gồm nhiều công đoạn và có thể xảy ra các lỗi sau:

Hình 7.6 Những khả năng lỗi khi gọi thủ tục từ xa

 

-         Máy khách không thể xác định được máy chủ: Nguyên nhân gây lỗi có thể do máy chủ và máy khách dùng các phiên bản khác nhau hoặc do chính máy chủ bị lỗi. Khắc phục bằng cách sử dụng tính năng phát hiện lỗi trong ngôn ngữ lập trình ứng dụng, tuy nhiên không phải ngôn ngữ nào cũng hỗ trợ phát hiện lỗi, nếu tự viết một ngoại lệ hay điều khiển tín hiệu thì sẽ phá hủy tính trong suốt.

-         Mất thông điệp yêu cầu từ máy khách gửi đến máy chủ: Đây là loại lỗi dễ xử lý nhất, hệ điều hành hay Stub của máy khách kích hoạt một bộ đếm thời gian khi gửi đi một yêu cầu, nếu bộ đếm thời gian đã trở về giá trị 0 mà vẫn không nhận được thông điệp phản hồi từ máy chủ thì nó sẽ gửi lại yêu cầu đó. Nếu máy khách nhận thấy có quá nhiều yêu cầu phải gửi lại thì nó sẽ xác nhận rằng máy chủ không hoạt động và sẽ quay lại thành kiểu lỗi "không xác định được máy chủ"

-         Máy chủ bị lỗi: sau khi nhận được yêu cầu từ máy khách, máy chủ sẽ thực hiện yêu cầu và trả kết quả thực hiện cho máy khách, như vậy có thể xảy ra ba tình huống sau:

o   Máy chủ đã nhận được yêu cầu nhưng chưa thực hiện thì gặp lỗi

o   Máy chủ đang thực hiện yêu cầu thì gặp lỗi

o   Máy chủ thực hiện xong yêu cầu nhưng chưa gửi kết quả về cho máy khách thì gặp lỗi.

Khi gặp lỗi kiểu này, ở phía máy chủ sẽ thực hiện theo ba chiến lược sau:

1.      Đợi đến khi nào máy chủ hoạt động trở lại, nó sẽ cố thực hiện yêu cầu đã nhận được trước khi lỗi đó, như thế RPC thực hiện ít nhất một lần.

2.      Máy chủ sau khi được khôi phục nó sẽ không thực hiện yêu cầu nhận được trước khi bị lỗi mà sẽ gửi lại thông báo hỏng cho máy khách, với cách này thì RPC thực hiện nhiều nhất một lần.

3.      Không thực hiện gì để đảm bảo cả, nếu máy chủ bị lỗi thì máy khách không hề hay biết, như vậy RPC có thể được thực hiện nhiều lần cũng có thể không thực hiện lần nào.

Máy khách có thể thực hiện theo 4 chiến lược sau:

1.      Máy khách không thực hiện gửi lại các yêu cầu vì thế không biết bao giờ yêu cầu đó mới thực hiện được hoặc có thể không bao giờ được thực hiện.

2.      Máy khách liên tục gửi lại yêu cầu, như vậy có thể dẫn tới trường hợp một yêu cầu được thực hiện nhiều lần.

3.      Máy khách chỉ gửi lại yêu cầu nào đó khi không nhận được thông điệp xác nhận phản hồi từ máy chủ thông báo đã nhận thành công. Trường hợp này, máy khách dùng bộ đếm thời gian, sau một khoảng thời gian xác định trước mà không nhận được xác nhận thì sẽ gửi lại yêu cầu đó.

4.      Máy khách gửi lại yêu cầu nếu nhận được thông báo lỗi từ máy chủ.

Với 3 chiến lược trên máy chủ và 4 chiến lược của máy khách sẽ cho 12 khả năng xảy ra, trong đó không có một chiến lược riêng rẽ máy khách và máy chủ cho kết quả tốt, như vậy cần thiết phải phối hợp chiến lược giữa máy khách và máy chủ.

Máy khách

Máy chủ

Thực hiện lại

Không thực hiện, gửi thông báo lỗi

Không thực hiện

Không gửi lại

Tốt

Không thực hiện

Không thực hiện

Liên tục gửi lại

Lặp

Tốt

Tốt

Gửi lại nếu không nhận được xác nhận

Lặp

Tốt

Tốt

Gửi lại nếu nhận được thông báo lỗi

Không xảy ra

Tốt

Không xảy ra

Giả sử ký hiệu M là sự kiện gửi thông điệp trả về cho máy khách, P là sự kiện thực thi công việc trong gọi thủ tục từ xa và C là sự kiện lỗi xảy ra trên máy chủ. Khi nhận được yêu cầu từ máy khách, máy chủ có thể thực hiện trước sau đó mới thông báo cho máy khách và ký hiệu là PàM hoặc thông báo trước kết quả sau đó mới thực thiện và ký hiệu là MàP, với ba sự kiện trên sẽ có sáu trường hợp xảy ra như sau:

MPC, PMC: Lỗi xảy ra sau khi đã hoàn thành gửi thông điệp cho máy khách và đã hoàn thành công việc xử lý.

MC(P): Lỗi xảy ra sau khi đã hoàn thành gửi thông điệp cho máy khách nhưng chưa hoàn thành công việc xử lý.

PC(M): Lỗi xảy ra khi đã hoàn thành công việc xử lý nhưng chưa kịp gửi thông điệp cho máy khách.

C(MP), C(PM): Lỗi xảy ra khi chưa thực hiện xử lý và cũng chưa gửi thông điệp cho máy khách

Máy khách

Máy chủ

MàP

PàM

MPC

MC(P)

C(MP)

PMC

PC(M)

C(PM)

Không gửi lại

Tốt

Không thực hiện

Không thực hiện

Tốt

Tốt

Không thực hiện

Liên tục gửi lại

Lặp

Tốt

Tốt

Lặp

Lặp

Tốt

Gửi lại nếu không nhận được xác nhận

Lặp

Tốt

Không thực hiện

Lặp

Tốt

Không thực hiện

Gửi lại nếu nhận được thông báo lỗi

Tốt

Không thực hiện

Tốt

Tốt

Lặp

Tốt

 

5.      Mất thông điệp phản hồi từ máy chủ gửi kết quả cho máy khách: Máy khách đánh số tuần tự cho các yêu cầu, máy chủ sẽ nhận ra được đâu là yêu cầu đã được gửi lại nhờ các số tuần tự này, do đó máy chủ sẽ không thực hiện lặp lại các yêu cầu. Tuy nhiên máy chủ vẫn phải gửi trả về thông điệp thông báo yêu cầu nào bị thất lạc hoặc có thể sử dụng một bit ở phần thông tin điều khiển của yêu cầu để phân biệt yêu cầu nào là yêu cầu đã được gửi lại.

6.      Máy khách bị lỗi ngay sau khi gửi yêu cầu tới máy chủ: Máy khách gửi yêu cầu tới máy chủ rồi bị lỗi trước khi nhận được trả lới từ máy chủ gửi về, công việc mà máy chủ thực hiện nhưng không có đích nào đợi để nhận kết quả. Như vậy sẽ gây lãng phí thời gian xử lý của CPU, trường hợp này có thể giải quyết bằng bốn cách sau:

-         Cách 1: trước khi gửi đi yêu cầu nào đó, stub của máy khách sẽ tạo ra một bản ghi xác định công việc cần thực hiện này và lưu nhật ký, sau khi phục hồi máy khách sẽ lấy lại bản ghi đó và và việc thực hiện công việc đã bị tạm dừng. Phương pháp này có nhược điểm về chi phí trong việc lưu lại mỗi bản ghi cho mỗi lời gọi thủ tục từ xa.

-         Cách 2: chia thời gian hoạt động liên tục của máy trạm thành các số liên tục gọi là các thời kì. Mỗi khi các máy khách được phục hồi thì tham số đó được tăng thêm một đơn vị, máy trạm sẽ gửi thông báo đến tất cả các máy khác thông báo số thời kì mới của mình.

-         Cách 3: khi nhận được thông điệp thông báo thời kì mới, mỗi máy chủ sẽ kiểm tra xem mình có đang thực hiện một tính toán từ xa nào hay không, nếu có sẽ cố xác định xem máy khách nào đã gửi yêu cầu này, nếu không xác định được thì quá trình tính toán này sẽ bị hủy bỏ.

-         Cách 4: quy định mỗi RPC chỉ có một khoảng thời gian xác định T để thực hiện, sau khi gặp lỗi, máy khách sẽ đợi thêm một khoảng thời gian T trước khi thực hiện lại, vấn đế đặt ra là phải lựa chọn giá trị khoảng thời gian T như thế nào cho hợp lý.

7.2.4       Truyền thông nhóm tin cậy

Truyền thông nhóm tin cậy là phải có cơ chế để đảm bảo thông điệp đó đến được tất cả các thành viên trong nhóm. Nếu xảy ra lỗi thì sử dụng số tuần tự các thông điệp để khắc phục, các thông điệp được lưu tại một vùng đệm của bên gửi cho đến khi nhận được bản tin xác nhận từ tất cả các thành viên trong nhóm. Nếu bên nhận xác định là bị mất một thông điệp nào đó thì nó sẽ yêu cầu gửi lại. Thông thường, bên gửi sẽ tự động gửi lại thông điệp sau trong khoảng thời gian xác định trước nếu không nhận được thông điệp xác nhận.

7.2.4.1     Truyền thông nhóm tin cậy cơ bản

Trong truyền thông nhóm tin cậy cơ bản. quá trình truyền tin được thực hiện theo cơ chế truyền thống, nghĩa là bên gửi sẽ chuyển thông điệp đến tất cả các thành viên trong nhóm và từng thành viên phải có trách nhiệm phản hồi kết quả đã nhận được thành công hay không, nếu có lỗi xảy ra thì áp dụng cơ chế sửa lỗi như truyền thông điểm – điểm.

Hình 7.7 Truyền thông nhóm tin cậy cơ bản

 

Như vậy, nếu một tiến trình nào đó trong nhóm yêu cầu gửi lại thì tất cả các thành viên khác đều nhận lại thông điệp mặc dù trước đó đã nhận thành công, hơn nữa bên gửi sẽ phải tiếp nhận phản hồi của tất cả các tiến trình trong nhóm.

7.2.4.2     Truyền thông  nhóm tin cậy trong các hệ thống lớn

Để tăng hiệu năng khi làm việc với nhóm có số lượng lớn các tiến trình, mô hình truyền thông nhóm tin cậy mở rộng tương tự như nguyên lý làm việc của giao thức SRM (Scalable Reliable Multicasting): không trả về thông điệp xác nhận thành công mà chỉ trả về thông điệp NACK thông báo khi có lỗi truyền. Để có thể thực hiện truyền thông nhóm tin cậy cho một số lượng lớn các tiến trình thì tổ chức các nhóm theo cấu trúc dạng cây, gốc là nhóm chứa tiến trình gửi và các nút là các nhóm có chứa tiến trình nhận. Việc chia thành các nhóm nhỏ hơn cho phép sử dụng các kịch bản truyền thông nhóm tin cậy cho từng nhóm, mỗi nhóm nhỏ sẽ đề cử một tiến trình đóng vai trò điều phối. Tiến trình điều phối có khả năng điều khiển việc truyền lại khi nhận được thông báo truyền lỗi. Tiến trình điều phối của mỗi nhóm sẽ có bộ đệm riêng, nếu không nhận được thông điệp thì nó sẽ gửi yêu cầu truyền lại tới tiến trình điều phối cấp cao hơn.

Trong qui định của truyền số liệu tin cậy sử dụng thông điệp xác nhận, khi tiến trình điều phối nhận thành công một thông điệp nó sẽ gửi thông điệp xác nhận tới tiến trình điều phối cấp cao hơn. Nếu tiến trình điều phối của một nhóm nhận được thông điệp xác nhận thành công việc chuyển thông điệp của tất cả các tiến trình trong nhóm gửi về thì nó sẽ xóa thông điệp khỏi bộ đệm của nó. Phương pháp phân cấp nảy sinh vấn đề xây dựng cấu trúc cây, rất nhiều trường hợp yêu cầu cây phải có cấu trúc động nên phải có một cơ chế tìm đường cho cây. Khi một tiến trình muốn gửi thông điệp cho một tập các tiến trình khác theo dạng nhóm, nó sẽ không gửi thông điệp tới tất cả các tiến trình của nhóm mà chỉ gửi đến một nhóm nhỏ các tiến trình cần nhận thông điệp đó. Vấn đế đặt ra là phải đảm bảo gửi được thông điệp tới tất cả các tiến trình trong nhóm hoặc không được gửi tới bất kì tiến trình nào nếu một tiến trình trong nhóm bị lỗi.

Truyền tin nhóm tin cậy cơ bản sẽ có hiệu năng thấp đối với các hệ thống lớn, giả sử phải gửi thông điệp đến N thành viên, khi đó bên gửi sẽ nhận được ít nhất N phản hồi từ các thành viên trong nhóm. Một giải pháp cải tiến có thể thực hiện bằng cách bên nhận không cần phải gửi phản hồi cho tất cả các thông điệp mà chỉ thông báo những thông điệp còn thiếu, do đó bên gửi phải lưu toàn bộ các thông điệp đã gửi. Để giảm thiểu số lượng phản hồi từ các thành viên nhận người ta đã áp dụng hai giải pháp: phản hồi không phân cấp và phản hồi có phân cấp.

Hình 7.8 Phản hồi không phân cấp

 

Giải pháp phản hồi không phân cấp giảm số lượng phản hồi đến bên gửi bằng cách sử dụng giao thức SRM (Scalable Reliable Multicasting) do Floyd đề xuất năm 1997. Bên nhận không phản hồi thông điệp ACK  để xác nhận đã nhận thành công, nếu phát hiện thiếu thông điệp phản hồi cho bên gửi và toàn bộ thành viên trong nhóm thông điệp NACK, nghĩa là chưa nhận được thông điệp hoặc thông điệp bị lỗi. Để giảm hơn nữa số lượng phản hồi NACK, giao thức vận dụng phương pháp tự triệt tiêu thông điệp NAC. Ví dụ, nếu một thành viên dự định phản hồi NACK nó sẽ chờ một thời gian nhất định, nếu không nhận được NACK tương ứng với thông điệp đó thì mới gửi các thành viên khác trong nhóm và bên gửi. Giao thức này đảm bảo chỉ phải gửi lại 01 thông điệp bị mất phụ thuộc vào việc lập lịch thông điệp phản hồi tại mỗi trạm nhận, nếu không cùng một thời điểm sẽ có nhiều trạm nhận gửi thông điệp NACK. Việc thiết lập thời gian trên toàn nhóm là điều không dễ dàng, bắt buộc mọi thành viên trong nhóm đều phải nhận thông điệp NACK ngay cả khi không cần thiết. Để khác phục vấn đề này, có thể tạo thêm một nhóm mới phục vụ cho thông điệp NACK, điều này rất khó quản lý trong mạng qui mô lớn. Giải pháp cải tiến giao thức SRM cũng mang lại hiệu quả lớn, các thành viên trong nhóm hỗ trợ nhau phục hồi những thông điệp bị mất trước khi chuyển thông điệp NACK cho bên gửi.

Hình 7.9 Điều khiển phản hồi phân cấp

 

Thay vì truyền thông cậy cho một nhóm lớn các tiến trình, điều khiển phản hồi phân cấp được tổ chức lại các nhóm nhỏ hơn theo cấu trúc hình cây, trong đó gốc là nhóm chứa tiến trình gửi và các nút là các nhóm có chứa tiến trình nhận. Mỗi nhóm bầu chọn tiến trình điều phối có nhiệm vụ xử lý các yêu cầu truyền lại. Tiến trình điều phối của mỗi nhóm sẽ có bộ đệm riêng, nếu không nhận được thông điệp thì sẽ gửi yêu cầu truyền lại tới tiến trình điều phối của nút cha. Đối với các thành viên trong nhóm có thể sử dụng kịch bản truyền nhóm cơ bản hoặc phản hồi không phân cấp. Việc xây dựng cấu trúc cây khá phức tạp, nhiều trường hợp yêu cầu cây phải có cấu trúc động nên phải có một cơ chế tìm đường.

7.3       Khẳng định phân tán

Một yêu cầu quan trọng của giao tác phân tán là phải đảm bảo tính nguyên tử, nghĩa là các lệnh trong giao tác phải được thực thi thành công trên tất cả các thành viên trong nhóm, nếu có bất kỳ thành viên nào thực hiện không thành công thì các thành viên khác cũng phải hủy bỏ giao tác, đặc tính này có thể đạt được bằng cách cài đặt giao thức khẳng định nguyên tử (ACP – Atomic Commit Protocol). Việc cài đặt giao thức ACP có thể thực hiện một pha, hai pha …., số pha thực hiện càng nhiều thì tính chính xác càng cao nhưng đổi lại hiệu năng của hệ thống có thể bị suy giảm.

7.3.1    Giao thức khẳng định một pha

Giao thức khẳng định một pha giảm độ phức tạp của cả thông điệp lẫn nhật ký sự kiện dựa trên giả thiết tất cả các thành viên đều thực hiện thành công giao tác. Giao thức khẳng định một pha thực hiện bầu chọn không tường minh và nhật ký điều phối coi mỗi hoạt động của giao tác đều được xác nhận trong mỗi thành viên. Thao tác xác nhận trong các giao thức này không chỉ có ý nghĩa thông báo giao tác đã bảo toàn sự cách ly và các thuộc tính không phân tầng mà còn cho biết giao tác không vi phạm bất kỳ ràng buộc nhất quán nào của mỗi bên tham gia.

Mô hình thiết lập khẳng định phải là mô hình phân cấp và tiến trình điều phối đảm nhận nhiệm vụ khẳng định. Trong khẳng định một pha, tiến trình điều phối thông báo với tất cả các thành viên còn lại hoặc là thực hiện hoặc là hủy một thao tác nào đó. Nếu thành viên nào đó không thực hiện được cũng không thể báo lại cho tiến trình điều phối biết, do đó không nên áp dụng cho các hệ thống đòi hỏi tính nhất quán cao.

7.3.2    Giao thức khẳng định hai pha

Xét một giao tác phân tán với các thành viên là một tập các tiến trình chạy ở một máy khác và không có lỗi xảy ra, giao thức khẳng định hai pha gồm pha biểu quyết và pha quyết định. Pha biểu quyết thực hiện hai bước, tiến trình điều phối gửi một thông điệp cầu biểu quyết VOTE_REQUEST tới tất cả các thành viên trong nhóm. Sau khi nhận được thông điệp VOTE_REQUEST, nếu có thể thực hiện được thì thành viên đó sẽ gửi lại cho tiến trình điều phối thông báo chấp nhận biểu quyết VOTE_COMMIT, nếu không sẽ gửi lại thông báo từ chối VOTE_ABORT. Pha quyết định cũng thực hiện hai bước, tiến trình điều phối tập hợp tất cả các biểu quyết của các thành viên, nếu tất cả đều chấp nhận giao dịch thì nó sẽ gửi một thông điệp GLOBAL_COMMIT tới tất cả các thành viên, chỉ cần một thành viên gửi thông báo từ chối thì tiến trình điều phối quyết định hủy giao dịch trên và sẽ gửi một thông điệp GLOBAL_ABORT cho tất cả các thành viên trong nhóm.

Hình 7.10 Giao thức khẳng định hai pha

 

Các thành viên sau khi đã gửi thông báo chấp nhận cam kết sẽ đợi phản hồi từ tiến trình điều phối, nếu nhận được thông báo GLOBAL_COMMIT thì giao tác sẽ được chấp thuận, còn nếu nhận được GLOBAL_ABORT thì giao tác sẽ bị hủy bỏ. Giao thức khẳng định hai pha đảm bảo tính nguyên tử và phục hồi độc lập nhưng chi phí đáng kể khi thực hiện giao tác bình thường, điều đó ảnh hưởng bất lợi tới hiệu năng của hệ thống. Nguyên nhân là do chi phí phải trả vì sự phức tạp trong trao đổi thông điệp, một lượng lớn thông điệp dùng cho việc điều phối thao tác trên các nút khác nhau và sự phức tạp của nhật ký ghi lại các thao tác trên từng nút.

7.3.3    Giao thức khẳng định ba pha

Nhược điểm chính của giao thức khẳng định hai pha là tốn nhiều thời gian chờ đợi, cả tiến trình điều phối lẫn các thành viên còn lại đều phải chờ một thông điệp nào đó được gửi đến, nếu tiến trình điều phối bị lỗi thì hoạt động của cả hệ thống sẽ bị ảnh hưởng. Giao thức khẳng định hai pha vận hành theo nguyên lý phong tỏa, nếu tiến trình điều phối bị lỗi thì các thành viên không thể đạt được quyết định cuối cùng. Để khắc phục nhược điểm của cam kết hai pha trong trường hợp tiến trình điều phối bị lỗi, Skeen đã đề xuất giao thức cam kết ba pha, các trạng thái trong cam kết ba pha khá giống cam kết hai pha nhưng thêm một trạng thái tiền khẳng định PRECOMMIT. Mặc dù giao thức khẳng định ba pha được đề cập đến rất nhiều trong các tài liệu nghiên cứu nhưng nó lại ít được sử dụng trong thực tế bởi vì hiện tượng phong tỏa trong giao thức cam kết hai pha rất ít khi xảy ra.

 

(a)                                   (b)

Hình 7.11 Giao thức khẳng định ba pha

(a) Máy trạng thái hữu hạn của thành phần điều phối

(b) Máy trạng thái hữu hạn của thành viên

 

Giống như giao thức khẳng định hai pha, giao thức khẳng định ba pha cũng gồm nhiều tiến trình trong đó có một tiến trình đóng vai trò điều phối, máy trạng thái hữu hạn của các tiến trình thể hiện trên hình 7.11. Bản chất của giao thức khẳng định ba pha thể hiện ở chỗ các trạng thái của thành phần điều phối và các thành viên tham gia đáp ứng hai điều kiện sau:

1.      Không có một trạng thái đơn lẻ nào mà từ đó có thể chuyển trực tiếp sang trạng thái khẳng định hoặc hủy bỏ.

2.      Không có trạng thái mà trong đó không thể đưa ra quyết định cuối cùng,
và từ đó có thể chuyển sang trạng thái khẳng định.

Hai điều kiện trên là cần thiết và đủ để đảm bảo giao thức khẳng định ba pha có thể hoạt động trong chế độ không phong tỏa. Thành phần điều phối trong giao thức khẳng định ba pha bắt đầu bằng việc gửi thông điệp yêu cầu bỏ phiếu (Vote-Request) đến tất cả các thành viên khác, sau đó sẽ chờ phản hồi từ các thành viên này. Chỉ cần 1 tiến trình bỏ phiếu hủy bỏ (ABORT) hoặc một tiến trình thành viên nào đó không phản hồi thì quyết định cuối cùng cũng sẽ là hủy bỏ, như vậy tiến trình điều phối sẽ gửi thông điệp hủy bỏ toàn cục (Global Abort) đến tất cả các tiến trình thành viên. Nếu tất cả các tiến trình thành viên đều phản hồi phiếu bầu đồng ý khẳng định, chắc chắn tất cả các tiến trình thành viên đã ở trạng thái sẵn sàng khẳng định (READY), nghĩa là giao tác có cơ hội được khẳng định, tiến trình điều phối sẽ gửi thông điệp chuẩn bị khẳng định (Prepare commit) đến tất cả các thành viên. Nếu tại thời điểm này tiến trình điều phối bị lỗi thì sẽ không có một thông điệp nào đươc gửi đến các tiến trình thành viên, sau một thời gian nhất định từng tiến trình thành viên sẽ không được phép hủy bỏ hay khẳng định giao tác, mỗi thành viên áp dụng điều kiện thứ nhất nên chúng phải tham khảo trạng thái của các thành viên khác, tất cả đều ở trạng thái quá hạn chờ thông điệp chuẩn bị khẳng định, do đó giao tác sẽ tự động bị hủy. Nhận được thông điệp chuẩn bị khẳng định từ tiến trình điều phối, các tiến trình thành viên sẽ phản hồi. Sau khi đã nhận được phản hồi từ tất cả các tiến tình thành viên, tiến trình điều phối sẽ gửi thông điệp khẳng định toàn cục (Global commit), nhận được thông điệp này các tiến trình thành viên sẽ thực hiện khẳng định giao tác, như vậy giao tác phân tán đã hoàn thành trên tất cả các thành viên của hệ thống.

Xảy ra tình huống một thành viên nào đó bị lỗi nên không có phản hồi, như vậy tiến trình điều phối bị phong tỏa ở trạng thái chuẩn bị khẳng định, nó biết chắc chắn tiến trình thành viên lỗi đã biết giao tác đang chờ để được khẳng định,  tiến trình điều phối có thể ra lệnh một cách an toàn cho những thành viên đang hoạt động bằng cách gửi thông điệp khẳng định toàn cục cho nhóm các tiến trình tham gia. Ngoài ra, tiến trình điều phối dựa vào giao thức phục hồi để các tiến trình lỗi có thể thực hiện khẳng định cho các giao tác khi chúng phục hồi trở lại.

Nếu tiến trình thành viên ở trạng thái READY, quá thời gian qui định mà vẫn không nhận được thông điệp chuẩn bị khẳng định, nó sẽ liên lạc với tiến trình thành viên khác, nếu trạng thái của tiến trình thành viên được hỏi là ABORT thì nó sẽ hủy bỏ giao tác, nếu là PRECOMMIT thì sẽ chuyển trạng thái của nó giống như thành viên đã hỏi, nếu là COMMIT thì sẽ thực hiện khẳng định giao tác. Nều thành viên ở trạng thái PRECOMMIT, quá thời gian qui định mà vẫn không nhận được thông điệp khẳng định toàn cục, nó sẽ liên lạc với tiến trình thành viên khác, nếu trạng thái của tiến trình thành viên được hỏi là COMMIT thì nó thực hiện khẳng định giao tác, nếu tất cả các tiến trình thành viên đều ở trạng thái PRECOMMIT thì nó cũng thực hiện khẳng định giao tác.

7.4       Phục hồi

Lỗi có thể xảy ra ở bất kỳ thời điểm nào, một hệ thống đáng tin cậy phải không những có khả năng phát hiện lỗi mà còn phải biết phục hồi sau khi gặp lỗi, nói cách khác phục hồi là các biện pháp đưa  hệ thống từ trạng thái bị lỗi trở về trạng thái không lỗi.

7.4.1    Các biện pháp phục hồi

Có hai cách tiếp cận phục hồi lỗi, phục hồi lùi và phục hồi tiến, tư tưởng của phương pháp phục hồi lùi là đưa hệ thống từ trạng thái lỗi ở thời điểm hiện tại về trạng thái không lỗi ở thời điểm trước khi xảy ra lỗi. Để làm được điều đó cần phải liên tục ghi lại trạng thái của hệ thống và khi hệ thống gặp lỗi sẽ chuyển về trạng thái đã sao lưu, thời điểm hệ thống thực hiện sao lưu dữ liệu và trạng thái gọi là điểm kiểm tra. Khác với phục hồi lùi, phục hồi tiến không đưa hệ thống trở lại trạng thái không lỗi trước khi xảy ra lỗi mà chuyển hệ thống sang trạng thái mới không lỗi để có thể tiếp tục hoạt động. Khó khăn lớn nhất của giải pháp này là phải biết trước những lỗi nào có thể xảy ra, chỉ khi đó mới có thể sửa lỗi và chuyển sang trạng thái mới. Có thể dễ dàng giải thích sự khác biệt giữa phục hồi tiến và phục hồi lùi khi xem xét cài đặt truyền thông tin cậy. Khi phát hiện thấy một đoạn tin bị lỗi, bên nhận sẽ yêu cầu bên gửi phải gửi lại đoạn tin đó, nghĩa là hệ thống đã chuyển về trạng thái trước khi gửi đoạn tin lỗi, đó là cách thể hiện của phục hồi lùi. Một giải pháp khác là sử dụng mã sửa chữa (Erasure Code), giả sử cần phải gửi k đoạn tin, bên gửi sẽ mã hóa thành n đoạn tin gọi là khối mã sửa chữa (n, k), chỉ cần nhận đủ k đoạn tin mã hóa sẽ có thể phục hồi lại được k đoạn tin nguyên gốc, nếu chưa đủ số lượng đoạn tin thì vẫn tiếp tục phải gửi cho đến khi dựng lại được các đoạn tin đã thất lạc.

Nói chung, kỹ thuật phục hồi lỗi lùi được sử dụng rộng rãi như một cơ chế tổng quát về phục hồi lỗi trong các hệ thống phân tán, ưu điểm của nó là tính độc lập với các tiến trình và như vậy có thể tích hợp vào tầng trung gian của hệ thống phân tán như một dịch vụ đa năng. Tuy nhiên phục hồi lùi cũng bộc lộ một số vấn đề, việc phục hồi hệ thống về trạng thái trước sẽ đòi hỏi chi phí tương đối lớn về hiệu năng, cách đơn giản để thoát khỏi vấn đề này là tạo ra cơ chế ít tốn kém bằng cách khởi động lại các thành phần. Cơ chế phục hồi lùi độc lập với các ứng dụng phân tán, không có gì đảm bảo sau khi phục hồi lỗi tương tự lại không lặp lại và như vậy có thể xảy ra vòng lặp phục hồi. Cuối cùng, dựa vào cơ chế điểm kiểm tra nhưng không phải lúc nào cũng có thể phục hồi về trạng thái trước khi xảy ra lỗi, ví dụ trường hợp các máy trả tiền tự động, sau khi máy đã nhả tiền thì khó có thể rút lại được.

Thực hiện điểm kiểm tra là thao tác làm suy giảm đáng kể hiệu năng của hệ thống, do đó nhiều hệ thống phân tán có khả năng chịu lỗi kết hợp điểm kiểm tra với việc ghi nhật ký thông điệp, tiến trình gửi sẽ ghi nhật ký thông điệp trước khi gửi và tiến trình nhận sẽ ghi nhật ký thông điệp trước khi chuyển lên tầng ứng dụng để thực hiện. Nếu tiến trình nhận gặp lỗi, tiến trình gửi chỉ việc phục hồi về trạng thái của điểm kiểm tra sau và lấy các thông điệp trong nhật ký kể từ thời điểm thực hiện điểm kiểm tra để gửi lại, như vậy có thể giãn tần suất thực hiện các điểm kiểm tra và vì vậy sẽ giảm thiểu ảnh hưởng tới hiệu năng của hệ thống.

Để phục hồi về trạng thái không lỗi thì dữ liệu phải được lưu trữ an toàn, dữ liệu không bị hỏng hóc ngay cả khi tiến trình bị sụp đổ hoặc ngay cả khi phương tiện lưu trữ bị lỗi. Dữ liệu thường được lưu trữ ở bộ nhớ RAM hoặc ổ đĩa cứng, nếu lưu trữ trong RAM thì sẽ bị mất khi mất điện hoặc khi máy tính gặp lỗi. Dữ liệu trên ổ đĩa cũng có thể bị lỗi, vì vậy cần thiết phải sử dụng kỹ thuật RAID để nhân bản trên nhiều ổ đĩa, thậm chí cần phải xây dựng chính sách sao lưu dữ liệu sang các máy tính khác.

7.4.2    Điểm kiểm tra

Trong hệ thống phân tán có khả năng chịu lỗi, phục hồi lùi đòi hỏi hệ thống phải đều đặn ghi lại trạng thái của nó vào vùng nhớ vĩnh cửu, đặc biệt phải ghi được trạng thái toàn cục nhất quán gọi là bản sao phân tán (snapshot). Trong bản sao phân tán, nếu một tiến trình nào đó ghi nhật ký nhận được bản tin thì chắc chắn tiến trình gửi cũng sẽ phải ghi nhật ký gửi bản tin đó, nếu có lỗi xảy ra thì các tiến trình này biết được sẽ phải bắt đầu từ đâu để phục hồi hệ thống.

 

Hình 7.12 Phục hồi lùi sử dụng trạng thái toàn cục nhất quán

 

Trong các lược đồ phục hồi lùi, mỗi tiến trình đều đặn ghi trạng thái của nó vào bộ nhớ cục bộ vĩnh cửu. Để phục hồi sau khi xảy ra lỗi, cần thiết phải dò tìm trạng thái nhất quán toàn cục từ những trạng thái cục bộ này, tốt nhất là phục hồi về bản sao phân tán gần nhất và gọi là đường phục hồi, nói cách khác đường phục hồi tương ứng với tập các điểm kiểm tra nhất quán gần nhất.

7.4.2.1     Điểm kiểm tra độc lập

Việc thực hiện điểm kiểm tra trong các hệ thống phân tán thông thường mang tính chất cục bộ, mỗi tiến trình đều đặn ghi trạng thái cục bộ của theo cách riêng biệt, điều đó sẽ gây khó khăn cho việc xác định đường phục hồi. Để tìm ra đường phục hồi mỗi tiến trình sẽ phải quay lui về trạng thái gần nhất đã đươc ghi lại, nếu các trạng thái cục bộ này không tạo nên được đường phục hồi thì tiếp tục phải quay lui về trạng thái trước nữa, quá trình phục hồi phân tầng này có thể dẫn đến hiện tượng dây chuyền.

Hình 7.13 Hiệu ứng dây chuyền trong phục hồi lùi

 

Hình 7.13 cho thấy, khi tiến trình P2 gặp lỗi thì cần phải phục hồi trạng thái của nó về điểm kiểm tra gần nhất, tiến trình P1 cũng sẽ phải quay lui về trạng thái của điểm kiểm tra gần nhất. Rất tiếc hai trạng thái gần nhất được lưu cục bộ này không hình thành trạng thái toàn cục nhất quán, tiến trình P2 ghi nhật ký đã nhận được thông điệp m2 nhưng nhật ký của tiến trình P1 lại không ghi nhận đã gửi thông điệp m2. Như vậy tiến trình P2 lại phải quay lui về trạng thái trước nữa, nhưng ở trạng thái này lại không fhi nhận đã gửi thông điệp m1 trong khi nhật ký của tiến trình P1 cho thấy đã nhận được thông điệp m1, tiến trình P1 lại quay lui về trạng thái trước nữa, cứ như vậy cả hai tiến trình phải quay lui về trạng thái ban đầu mới tìm thấy đường phục hồi.

Các tiến trình thực hiện điểm kiểm tra cục bộ độc lập với nhau gọi là phương pháp điểm kiểm tra độc lập, một giải pháp khác là phối hợp điểm kiểm tra toàn cục, nó đòi hỏi phải có sự đồng bộ trên tất cả các tiến trình và như vậy sẽ làm suy giảm hiệu năng hệ thống. Một  nhược điểm khác nữa của điểm kiểm tra độc lập còn thể hiện khi dọn dẹp không gian lưu trữ cục bộ, tuy nhiên nhược điểm chính vẫn là vấn đề xác định đường phục hồi. Cài đặt điểm kiểm tra độc lập đòi hỏi phải ghi lại những phụ thuộc để các tiến trình có thể cùng nhau quay lui về trạng thái toàn cục nhất quán. Giả sử CPi(m) là điểm kiểm tra thứ m của tiến trình Pi, INTi(m) là khoảng thời gian giữa hai điểm kiểm tra CPi(m-1) và CPi(m). Khi tiến trình Pi gửi thông điệp trong khoảng thời gian  INTi(m), nó gắn kèm thông điệp cặp (i,m). Tiến trình Pj nhận được thông điệp với cặp đính kèm (i,m)  trong khoảng thời gian INTj(n), nó ghi nhận phụ thuộc  INTi(m) à INTj(n), khi thực hiện điểm kiểm tra CPj(n) nó cũng ghi nhật ký sự phụ thuộc này. Khi tiến trình Pi quay lui về điểm kiểm tra CPi(m-1) thì cần phải đảm bảo rằng tất cả các tiến trình đã nhận được thông điệp từ Pi trong khoảng thời gian INTi(m) cũng phải quay lui về điểm kiểm tra trước khi nhận được các thông điệp đó. Như vậy tiến trình Pj sẽ phải quay lui về điểm kiểm tra CPj(n-1), nếu vẫn chưa đạt được trạng thái nhất quán toàn cục thì tiếp tục phải quay lui về điểm kiểm tra trước nữa. Việc tính toán đường phục hồi đòi hỏi phải phân tích những phụ thuộc đã ghi nhận trong mỗi tiến trình khi thực hiện điểm kiểm tra, không cần phải đi sâu thêm về vấn đề này cũng thấy công việc này phức tạp thế nào và điều đó cho thấy sự cần thiết phải thực hiện điểm kiểm tra phối hợp. Vì vậy kỹ thuật thực hiện điểm kiểm tra phối hợp đã được ứng dụng rộng rãi, đặc biệt đối với các hệ thống có qui mô lớn.

7.4.2.2     Điểm kiểm tra phối hợp

Trong kỹ thuật điểm kiểm tra phối hợp, tất cả các tiến trình đồng bộ với nhau để cùng thực hiện việc ghi trạng thái vào bộ nhớ lưu trữ ổn định cục bộ, ưu điểm chính của nó là các trạng thái cục bộ đã tự hình thành tính nhất quán toàn cục, như vậy sẽ tránh được hiệu ứng quay lui dây chuyền. Giải thuật ảnh phân tán được sử dụng để phối hợp thực hiện điểm kiểm tra, đó là ví dụ về việc phối hợp điểm kiểm tra không phong tỏa. giải pháp đơn giản hơn là sử dụng giao thức phong tỏa hai pha, tiến trình điều phối gửi thông điệp yêu cầu thực hiện điểm kiểm tra CHECKPOINT_REQUEST đến tất cả các tiến trình, nhận được thông điệp này các tiến trình sẽ thực hiện điểm kiểm tra cục bộ và gửi thông điệp xác nhận đã hoàn thành cho tiến trình điều phối, tất cả các thông điệp nhận được sau đó hoặc những thông điệp cần gửi đều chuyển vào hàng đợi cho đến khi nhận được thông điệp hoàn thành điểm kiểm tra CHECKPOINT_DONE từ tiến trình điều phối. Sau khi nhận được thông điệp xác nhận từ tất cả các tiến trình đã hoàn thành thực hiện điểm kiểm tra, tiến trình điều phối sẽ gửi thông điệp CHECKPOINT_DONE đến tất cả các tiến trình thành viên để các tiến trình đó có thể tiếp tục thực hiện công việc của mình.

Có thể cải tiến giải thuật này bằng cách chỉ gửi thông điệp yêu cầu điểm kiểm tra  đến các tiến trình phụ thuộc vào phục hồi của thành phần điều phối, bỏ qua các tiến trình khác. Một tiến trình được gọi là phụ thuộc khi nó nhận được thông điệp trực tiếp hoặc gián tiếp có quan hệ nhân quả với thông điệp đã nhận được từ tiến trình điều phối kể từ khi thực hiện điểm kiểm tra cuối cùng, điều này dẫn tới khái niệm ảnh lũy tiến. Để thực hiện ảnh lũy tiến, tiến trình điều phối chỉ gửi thông điệp CHECKPOINT_REQUEST đến các tiến trình đã nhận được thông điệp của nó từ thời điểm thực hiện điểm kiểm tra cuối cùng, tiến trình Pi nhận được thông điệp này sẽ làm tương tự bằng cách gửi thông điệp CHECKPOINT_REQUEST đến các tiến trình khác có liên quan đến nó, quá trình này chỉ được phép thực hiện một lần. Sau khi các tiến trình đã hoàn thành thực hiện điểm kiểm tra cục bộ, tiến trình điều phối sẽ gửi thông điệp thứ hai CHECKPOINT_DONE để các tiến trình có liên quan tiếp tục thực hiện công việc của mình.

7.4.3    Ghi nhật ký thông điệp

Thực hiện điểm kiểm tra đòi hỏi ghi trạng thái vào bộ nhớ ổn định, vì vậy cần  giảm số lần thực hiện điểm kiểm tra nhưng vẫn phải đảm bảo khả năng phục hồi, một trong những kỹ thuật quan trọng được áp dụng trong hệ thống phân tán là ghi nhật ký thông điệp. Ý tưởng cơ bản của kỹ thuật này dựa trên giả thiết nếu thông điệp được gửi lại thì có thể đạt được trạng thái nhất quán toàn cục mà không cần phục hồi về trạng thái lấy từ bộ nhớ ổn định, thay vào đó trạng thái của điểm kiểm tra được lấy từ điểm khởi đầu và tất cả các thông điệp từ điểm khởi đầu đó sẽ được gửi lại và xử lý phù hợp.  Cách tiếp cận này hoạt động tốt với giả thiết dựa trên mô hình xác định từng phần, việc thực thi của mỗi tiến trình là một chuỗi các khoảng sự kiện, khoảng sự kiện bắt đầu từ thời điểm xảy ra sự kiện không xác định và kết thúc tại thời điểm của sự kiện cuối cùng trước khi xảy ra sự kiện không xác định kế tiếp. Nếu thực hiện lại các khoảng sự kiện này sẽ được kết quả tương ứng với kết quả của những sự kiện không xác định, như vậy việc ghi lại tất cả các sự kiện không xác định chuyển thành có thể lặp lại lại toàn bộ những thực thi của tiến trình theo cách xác định.

Việc ghi nhật ký thông điệp là cần thiết để phục hồi tiến trình sụp đổ và như vậy sẽ phục hồi được trạng thái toàn cục nhất quán, điều quan trọng là phải biết chính xác khi nào các thông điệp cần được ghi lại. Alvisi và Marzullo đã mô tả nhiều lược đồ ghi nhật ký thông điệp, mỗi thông điệp chứa thông tin điều khiển để có thể được gửi lại và xử lý chính xác. Thông tin điều khiển xác định bên gửi và bên nhận, số tuần tự để tránh trùng lặp, số thứ tự phân phát để quyết định chính xác khi nào sẽ được xử lý ở bên nhận. Một thông điệp được coi là ổn định nếu nó không bị thất lạc trên kênh truyền vì nó sẽ được ghi vào bộ nhớ ổn định, những thông điệp đó sẽ được sử dụng để gửi lại khi cần thực hiện phục hồi. Khi một tiến trình nào bị sụp đổ, tiến trình đó sẽ phải được phục hồi, ngay cả khi phục hồi thành công cũng có thể dẫn tới hiện tượng tiến trình mồ côi, đó là những tiến trình sống sót sau sự sụp đổ của tiến trình khác nhưng trạng thái của nó không nhất quán với tiến trình  sụp đổ và đã được phục hồi, để làm rõ vấn đề này cần phải phân tích chi tiết về quá trình ghi nhật ký thông điệp.

Hình 7.14 Phát lại thông điệp không chính xác sau khi phục hồi

 

Ví dụ trên hình 7.14, tiến trình Q nhận thông điệp m1 tiến trình P và m2 từ tiến trình R, thông điệp m1 có ghi nhật ký trong khi thông điệp m2 không được ghi nhật ký, sau đó Q lại gửi thông điệp m3 cho tiến trình R và thông điệp này được ghi vào nhật ký. Sau khi gửi thông điệp m3, tiến trình Q sụp đổ do đó nó phải thực hiện quá trình phục hồi, tiến trình Q lấy thông điệp từ nhật ký và phục hồi thành công thông điệp m1 nhưng không thể phục hồi thông điệp m2 vì thông điệp này không được ghi trong nhật ký. Vì thông điệp m3 phụ thuộc nhân quả vào thông điệp m2, m2 không được phát lại thì Q cũng sẽ không thực hiện gửi thông điệp m3. Tiến trình R có bản sao thông điệp m3 nhưng thông điệp này lại không có trong tiến trình Q  sau khi phục hồi và như vậy trạng thái của tiến trình Q không nhất quán với tiến trình R, khi đó R được gọi là tiến trình mồ côi.

Một cách tổng quát, mỗi thông điệp m dẫn tới tập DEP(m) các tiến trình phụ thuộc vào sự phân phát thông điệp m, nếu một thông điệp m’ phụ thuộc nhân quả với thông điệp m  và thông điệp m’ được phân phát đến bất kỳ tiến trình nào thì tiến trình đó cũng sẽ là thành viên của tập DEP(m). Thông điệp m’ phụ thuộc nhân quả vào m nếu nó được gửi bởi một tiến trình trước đó đã phân phát thông điệp m, hoặc m’ thuộc tiến trình đã phân phát thông điệp khác nhưng thông điệp đó phụ thuộc nhân quả vào thông điệp m. Tập COPY(m) gồm các tiến trình nhận được bản sao thông điệp m nhưng chưa kịp ghi vào vùng nhớ ổn định. Khi một tiến trình chuyển tiếp thông điệp m thì nó cũng là thành viên của COPY(m), nếu tất cả các tiến trình này sụp đổ thì rõ ràng việc phát lại thông điệp m sẽ không thể thực hiện được. Tiến trình mồ côi xuất hiện khi nó phụ thuộc vào thông điệp nhưng không có cách nào phát lại thông điệp đó.

Để tránh hiện tượng tiến trình mồ côi thì cần phải chắc chắn rằng mỗi tiến trình trong tập COPY(m) sụp đổ thì không ở trong tập DEP(m) của tiến trình sống sót, nghĩa là tất cả các tiến trình trong DEP(m) cũng phải bị sụp đổ. Điều kiện này có thể được thực hiện nếu đảm bảo rằng mọi tiến trình là thành viên của DEP(m) thì cũng là thành viên của COPY(m), nói cách khác nếu một tiến trình phụ thuộc thông điệp m thì nó phải giữ bản sao của thông điệp m. Về cơ bản, có thể giải quyết vấn đề tiến trình mồ côi bằng cách sử dụng giao thức ghi nhật ký bi quan hoặc lạc quan. Giao thức bi quan đảm bảo rằng mỗi thông điệp chưa ổn định thì chỉ có nhiều nhất một tiến trình phụ thuộc vào nó, như vậy tiến trình sẽ chỉ được phép gửi thông điệp khi tất cả các thông điệp đã được ghi vào bộ nhớ ổn định, nghĩa là tiến trình đã thuộc tập COPY(m). Ngược lại, giao thức ghi nhật ký lạc quan, công việc thực tế được thực hiện sau khi xảy ra sụp đổ, tiến trình mồ côi trong tập DEP(m) sẽ quay lui cho đến khi không thuộc tập này nữa, như vậy nó phải lưu vết các phụ thuộc và vì vậy sẽ làm phức tạp hóa vấn đề cài đặt. So sánh hai cách tiếp cận trên có thể thấy cách tiếp cận bi quan đơn giản hơn cách tiếp cận lạc quan rất nhiều, vì vậy trong thực tế người ta thường sử dụng cách tiếp cận bi quan.

 

 


CHƯƠNG 8:                   NHẤT QUÁN VÀ NHÂN BẢN

Để đảm bảo an toàn và nâng cao hiệu năng cho hệ thống phân tán người ta thường nhân bản dữ liệu, tuy nhiên khi tạo nhiều bản sao sẽ nảy sinh vấn đề về tính nhất quán. Điều này có nghĩa là khi một bản sao được cập nhật thì các bản sao khác cũng phải cập nhật theo, nếu không các bản sao sẽ không giống nhau nữa. Nhân bản dữ liệu để tăng độ tin cậy và tính sẵn sàng của hệ thống, khi dữ liệu bị lỗi hay vì một nguyên nhân nào đó mà không thể dùng được thì có thể dùng ngay bản sao dữ liệu để hệ thống không bị gián đoạn và tránh sử dụng các dữ liệu không chính xác. Nhân bản dữ liệu cũng nhằm mục đích tăng hiệu năng của hệ thống và do đó có thể tăng quy mô cả về số lượng lẫn phạm vi địa lý.

Kỹ thuật nhân bản cũng đã từng được áp dụng trong các hệ thống độc lập, ví dụ hệ quản trị cơ sở dữ liệu sao chép các bản ghi vào vùng đệm nhằm tăng tốc độ đọc/ghi dữ liệu. Trong hệ thống phân tán, dữ liệu được nhân bản và đặt tại các máy chủ sao cho giảm thiểu lượng thông tin lưu chuyển trên mạng và quãng đường vận chuyển. Tuy nhiên kỹ thuật nhân bản sẽ làm suy giảm của tính nhất quán, có sự thay đổi trên một dữ liệu mà không cập nhật kịp thời trên các bản sao của nó, điều này có thể dẫn đến những sai sót trong xử lý. Để đảm bảo tính nhất quán có thể xuất phát từ cách tiếp cận lấy dữ liệu làm trung tâm hay cách tiếp cận lấy máy khách làm trung tâm. Chương này sẽ giới thiệu chi tiết về tính nhất quán khi nhân bản dữ liệu và các phương pháp khác nhau để đạt được mục đích này.

8.1       Giới thiệu chung

Chúng ta bắt đầu bằng cách thảo luận lợi ích của việc nhân bản và mối liên quan của nó tới qui mô của hệ thống phân tán, sau đó sẽ tập trung phân tích tính nhất quán. Vấn đề quan trọng trong các hệ thống phân tán là các tiến trình đồng thời truy nhập đến dữ liệu chia sẻ, tính nhất quán trong những trường hợp này thể hiện những gì tiến tiến trình mong đợi khi đọc và cập nhật dữ liệu chia sẻ trong khi các tiến trình khác cũng đang truy nhập dữ liệu đó. Các mô hình nhất quán cho những dữ liệu chia sẻ thường khó cài đặt hiệu quả trong những hệ thống phân tán qui mô lớn, trong nhiều trường hợp các mô hình đơn giản có thể sẽ được sử dụng để dễ dàng cài đặt hơn. Ví dụ, các mô hình lấy máy khách làm trung tâm tập trung đảm bảo tính nhất quán dưới góc độ của từng máy khách.

Định nghĩa tính nhất quán mới chỉ là một nửa của vấn đề, cần phải xem xét cách cài đặt thực tế như thế nào, do đó phải giải quyết hai vấn đề căn bản trong nhân bản. Thứ nhất phải quản lý các bản sao, vấn đề không phải chỉ quản lý vị trí của các bản sao mà còn phải giải quyết vấn đề phân tán nội dung đến các máy chủ đó. Vấn đề thứ hai là bằng cách nào duy trì tính nhất quán của các bản sao, trong nhiều trường hợp các ứng dụng yêu cầu dạng nhất quán mạnh, nghĩa là các thao tác cập nhật phải được lan tỏa ngay lập tức đến các bản sao, nhiều giải pháp cũng sẽ được đề cập đến để thực hiện cài đặt thực tế các mô hình nhất quán.

8.1.1    Lý do nhân bản

Có hai lý do phải nhân bản dữ liệu, đó là tăng độ tin cậy và cải thiện hiệu năng cho hệ thống. Với lý do thứ nhất, nếu một bản sao bị lỗi thì hệ thống vẫn có thể hoạt động sau khi chuyển sang  bản sao khác, bằng cách duy trì nhiều bản sao có thể bảo vệ dữ liệu tốt hơn đề phòng khi xảy ra lỗi. Ví dụ nếu có ba bản sao dữ liệu, mọi thao tác đọc và ghi đều thực hiện trên các bản sao này thì có thể tự bảo vệ khi một thao tác ghi bị lỗi bằng cách lấy giá trị của hai bản sao còn lại. Một cách tổng quát, dữ liệu được lưu trên N bản sao, khi dữ liệu của một bản sao nào đó bị lỗi  thì hoàn toàn có thể tin cậy dữ liệu của ít nhất N/2+1 bản sao không lỗi.

Lý do thứ hai cải thiện hiệu năng khi mở rộng qui mô là hoàn toàn dễ hiểu, các máy chủ bản sao được đặt ở nhiều vị trí địa lý khác nhau và như vậy yêu cầu của máy khách không bị tập trung về một máy chủ, thậm chí có thể áp dụng kỹ thuật cân bằng tải hoặc tính toán phân tán để chia nhỏ công việc cho nhiều máy chủ thực hiện. Việc phân bố các máy chủ bản sao tại các vị trí địa lý khác nhau sẽ tạo điều kiện cho máy khách lựa chọn máy chủ thích hợp nhất để xử lý, tiết kiệm thời gian truy nhập và đồng thời giảm lượng dữ liệu lưu chuyển trên mạng. Hiệu năng của máy khách tăng lên nhưng việc duy trì tính nhất quán giữa các bản sao có thể lại làm tăng đáng kể lưu lượng mạng.

Nhân bản mang lại lợi ích cho tính tin cậy và hiệu năng nhưng lại phải đối mặt với vấn đề nhất quán, khi một bản sao bị thay đổi thì nội dung của nó sẽ khác với các bản sao còn lại, như vậy cần phải đảm bảo rằng những thay đổi đều sẽ phải thực hiện trên tất cả các bản sao, vấn đề nằm ở chỗ thành phần nào và khi nào thực hiện những thay đổi này. Để minh họa vấn đề này có thể lấy trường hợp trang web làm ví dụ, yêu cầu truy nhập trang web có thể phải thực hiện trong vài giây. Để nâng cao hiệu năng trình duyệt thường lưu cục bộ bản sao của trang web gọi là cache, nếu người dùng truy yêu cầu trang web lần nữa thì trình duyệt sẽ tự động trả về bản sao cục bộ này, do đó thời gian truy nhập có thể coi như xấp xỉ bằng 0. Tuy nhiên nếu người dùng luôn luôn muốn phiên bản mới nhất của trang thì thật là không may mắn, vấn đề nằm ở chỗ trong khoảng thời gian giữa hai lần truy nhập trang web đã bị thay đổi nhưng những thay đổi đó vẫn chưa lan tỏa đến các bản sao đã lưu trên máy khách, kết quả là người dùng sẽ nhìn thấy nội dung cũ. Một giải pháp cho vấn đề bản sao cũ là cấm trình duyệt giữ các bản sao ở vị trí đầu tiên, thực sự cho phép máy chủ hoàn toàn phụ trách việc nhân bản, tuy nhiên giải pháp này vẫn có thể dẫn đến thời gian truy nhập kém nếu như không có bản sao nào gần với người sử dụng. Một giải pháp khác là cho phép máy chủ làm mất hiệu lực hoặc cập nhật các bản sao nhưng nhưn thế đòi hỏi máy chủ phải lưu vết tất cả các bộ nhớ cache và gửi thông điệp cho chúng, kết quả là hiệu năng tổng thể của máy chủ sẽ bị suy giảm nghiêm trọng.

8.1.2    Nhân bản là kỹ thuật mở rộng qui mô

Nhân bản và lưu bản sao cache để nâng cao hiệu năng đã được áp dụng phổ biết như một kỹ thuật mở rộng qui mô hệ thống, việc đặt các bản sao dữ liệu gần với các tiến trình sử dụng chúng có thể cải thiện hiệu năng bằng cách giảm thời gian truy nhập và như vậy giải quyết được các vấn đề về qui mô hệ thống. Cân đối giữa việc duy trì nội dung mới nhất với yêu cầu băng thông mạng cần phải được xem xét kỹ lưỡng, ví dụ tiến trình P đọc bản sao N lần/s và bản sao được cập nhật M lần/s, nếu N nhỏ hơn M rất nhiều, nghĩa là tỉ lệ đọc/ghi rất thấp thì có thể thấy kết quả của nhiều lần cập nhật đã không được tiến trình P sử dụng, làm cho truyền thông mạng cho những phiên bản này trở nên vô ích. Trong trường hợp này nên cài đặt bản sao gần với tiến trình P hoặc áp dụng chiến lược khác để cập nhật bản sao, vấn đề này sẽ được đề cập chi tiết trong phần sau.

Tuy nhiên, vấn đề nghiêm trọng hơn đó ở chỗ việc duy trì nhiều bản sao nhất quán cũng có thể là chủ đề cho các vấn đề nghiêm trọng về qui mô, tập các bản sao được coi là nhất quán khi tất cả các bản sao đều giống nhau, nghĩa là thao tác đọc tại bất kỳ bản sao nào cũng trả về kết quả như nhau, kết quả là thao tác cập nhật được thực hiện trên một bản sao sẽ phải được lan tỏa đến tất cả các bản sao trước khi thao tác kế tiếp thực hiện, không phân biệt bản sao khởi sướng hay thực hiện thao tác, nhất quán loại này gọi là chặt chẽ và cũng được gọi là nhân bản đồng bộ. Tư tưởng chính là thao tác cập nhật được thực hiện trên các bản sao như một thao tác nguyên tử hay còn gọi là giao tác phân tán, đáng tiếc việc cài đặt tính nguyên tử liên quan đến lượng lớn các bản sao có thể bị phân tán rải rác trên các mạng qui mô lớn vốn rất khó thực hiện khi các thao tác cần phải được hoàn thành trong thời gian ngắn nhất.

Khó khăn bắt nguồn từ thực tế cần phải đồng bộ tất cả các bản sao, về mặt nguyên tắc, các bản sao phải đạt được sự đồng thuận trên vấn đề chính xác khi nào thao tác cập nhật sẽ được thực hiện cục bộ, các bản so có thể phải quyết định thứ tự toàn cục của các thao tác dựa trên nhãn thời gian Lamport hoặc cho phép tiến trình điều phối qui định thứ tự thực hiện. Đồng bộ toàn cục chiếm lượng lớn thời gian truyền thông, đặc biệt khi các bản sao trải dài trên mạng diện rộng. Chúng ta đối mặt với tình thế tiến thoái lưỡng nan, một mặt có thể làm giảm bớt các vấn đề về hiệu năng khi mở rộng qui mô bằng cách áp dụng nhân bản và bộ nhớ cache, mặt khác giữ cho tất cả các bản sao nhất quán toàn cục đòi hỏi đồng bộ toàn cục mà điều này thì lại kéo theo chi phí về hiệu năng. Trong nhiều trường hợp chỉ có cách nới lỏng các ràng buộc nhất quán, nếu giảm bớt yêu cầu cập nhật phải được thực hiện như các thao tác nguyên tử thì mới có thể tránh được đồng bộ toàn cục và như thế mới tăng hiệu năng, cái giá phải trả đó là các bản sao có thể không phải lúc nào cũng giống nhau. Như vậy, nhất quán phải được nới lỏng đến mức nào sẽ phụ thuộc rất lớn vào việc truy nhập và các dạng cập nhật của dữ liệu nhân bản cũng như mục đích sử dụng những dữ liệu đó. Trong những phần sau, trước hết sẽ đề cập tới các mô hình nhất quán bằng cách định nghĩa chính xác nhất quán thực sự là gì, sau đó sẽ thảo luận những cách khác nhau để cài đặt các mô hình nhất quán.

8.2       Các mô hình nhất quán lấy dữ liệu làm trung tâm

Khái niệm nhất quán ở đây được hiểu trong ngữ cảnh các thao tác đọc/ghi dữ liệu, cho dù đó là dữ liệu được lưu trong bộ nhớ, trên tập tin hay trong hệ quản trị cơ sở dữ liệu đều gọi chung là kho dữ liệu. Kho dữ liệu có thể được lưu trữ phân tán trên nhiều máy tính, mỗi tiến trình có thể truy nhập dữ liệu trong kho được coi là có bản sao cục bộ sẵn có của toàn bộ kho dữ liệu. Thao tác làm thay đổi dữ liệu được xếp vào loại thao tác ghi, nếu không thay đổi thì xếp vào loại thao tác đọc.

Hình 8.1 Tổ chức kho dữ liệu trong hệ thống phân tán

 

Mô hình nhất quán, về bản chất đó là thỏa thuận giữa tiến trình và kho dữ liệu, các tiến trình phải tuân thủ một số qui tắc để đảm bảo tính chính xác của dữ liệu. Thông thường, tiến trình thực hiện thao tác đọc mục dữ liệu và hy vọng sẽ nhận được giá trị phản ánh kết quả ghi cuối cùng đã thực hiện trên mục dữ liệu đó. Vì không tồn tại đồng hồ toàn cục nên khó có thể xác định được thao tác ghi nào là thao tác được thực hiện cuối cùng. Để thay thế, chúng ta phải định nghĩa một số mô hình nhất quán, mỗi mô hình sẽ hạn chế khả năng đọc giá trị của các mục dữ liệu, nói cách khác sẽ không có mô hình nhất quán toàn diện.

8.2.1       Nhất quán liên tục

Như đã đề cập trong phần giới thiệu, hiện nay chưa có một giải pháp nhân bản nào được coi là giải pháp tốt nhất, nhân bản dữ liệu đặt ra những vấn đề liên quan tới tính nhất quán và do đó chưa có một phương pháp tổng quát nào giải quyết hiệu quả vấn đề này. Chỉ khi nới lỏng tính nhất quán thì mới hy vọng đạt được giải pháp hiệu quả, đáng tiếc lại không có một qui tắc chung nào để nới lỏng tính nhất quán, điều này hoàn toàn dựa vào yêu cầu khi xây dựng phần mềm. Ví dụ, khi xây dựng phần mềm có thể đưa ra các tiêu chí nhất quán sau:

-         Sự chênh lệch về giá trị các bản sao: Giá trị có thể là của một trường dữ liệu nhưng cũng có thể là số lượng các thao tác làm thay đổi dữ liệu.

-         Sự chênh lệch trạng thái: Thời gian cập nhật cuối cùng lên dữ liệu.

-         Sự chênh lệch thứ tự các thao tác cập nhật: Khá phức tạp, nhất là đối với các thao tác vì một lý do nào đó bị hủy bỏ.

Để xác định tính không nhất quán, Yu và Vahdat đưa ra khái niệm đơn vị nhất quán, ví dụ minh họa thể hiện trên hình 8.2, mỗi bản sao duy trì một đồng hồ vector hai phần tử, phần tử thứ nhất thể hiện nhãn thời gian của bản sao A và phần tử thứ 2 thể hiện nhãn thời gian của bản sao B, sử dụng ký hiệu <t, i>    thao tác tiến trình i thực hiện tại thời gian logic t.

 

Đồng hồ vector A: (15, 5)

Độ lệch thao tác: 3

Sai số: (1, 5)

Đồng hồ vector B: (0, 11)

Độ lệch thao tác: 2

Sai số: (3, 6)

Hình 8.2 Tính nhất quán với điều kiện nới lỏng thứ tự thao tác

 

Trong ví dụ này, hai bản sao thao tác trên các mục dữ liệu x và y, giả thiết ban đầu chúng đều có giá trị bằng 0. Bản sao A nhận được thao tác <5,B>: x:=x+2  từ bản sao B, thao tác ghi dữ liệu vào x đã được lưu vào vùng nhớ vĩnh cửu và không thể quay lui. Bản sao A dự kiến thực hiện ba thao tác thay đổi dữ liệu <8, A>, <12, A> và <14, A>, như vậy đồng hồ vector trên bản sao A sau các thao tác trên sẽ là (15,5) và độ lệch thứ tự thao tác là 3. Chỉ có thao tác của bản sao B  là <10, B> mà A chưa nhìn thấy làm cho độ lệch thao tác là 1. Trọng số của độ lệch giá trị là hiệu số lớn nhất giữa giá trị của các biến số trên các bản sao, trong ví dụ này giá trị (x,y) trên bản sao A là (2, 0), trong khi đó giá trị trên bản sao B là (2, 5), vì vậy độ lệch giá trị sẽ là max(|2-2|,|5-0|)=5. Tương tự, bản sao B dự kiến thực hiện hai thao tác <5, B> và <10, B>, sau các thao tác vẫn chưa nhìn thấy các thao tác từ bản sao A nên đồng hồ vector trên bản sao B có giá trị là (0, 11), như vậy độ lệch thao tác là 2, do chưa khẳng định thay đổi nên giá trị của các biến (x, y) vẫn là (0, 0) trong khi đó bản sao A đã có thể thực hiện khằng định giá trị cho hai biến này nên giá trị của chúng là (3, 6), vì vậy độ lệch giá trị bằng max(|3-0|,|6-0|)=6. Nếu độ lệch số lượng thao tác thực hiện trên các bản sao và sai số không vượt quá ngưỡng cho phép thì có thể coi như đã đáp ứng yêu cầu nhân bản.

Cần thiết phải cân nhắc khi lựa chọn đơn vị nhất quán, nếu đơn vị nhất quán đại diện cho một lượng lớn dữ liệu, ví dụ toàn bộ cơ sở dữ liệu, thì các cập nhật sẽ được tập hợp lại cho tất cả dữ liệu trong đơn vị nhất quán, kết quả là các bản sao sẽ sớm trở nên không nhất quán.  Hình 8.3 minh họa đơn vị nhất quán, hai bản sao có thể khác nhau nếu còn tồn tại một yêu cầu cập nhật chưa được thực hiện. Trường hợp (a) lựa chọn đơn vị nhất quán với độ lệch số lượng cập nhật là 2, khi thực hiện xong ở bản sao thứ nhất mới lan tỏa cập nhật tới bản sao thứ hai. Trường hợp (b) lựa chọn đơn vị nhất quán nhỏ hơn, khi thực hiện cập nhật trên bản sao thì ngay lập tức sẽ được thực hiện trên các bản sao khác, do đó có thể coi các bản sao đều được cập nhật giá trị mới nhất. Vấn đề chọn đơn vị nhất quán đặc biệt quan trọng khi các mục dữ liệu hoàn toàn độc lập với nhau, trường hợp (a) có thể coi như đã chọn sai đơn vị nhất quán.

 

(a) Lan truyền cập nhật

(b) Không lan truyền cập nhật

Hình 8.3 Số lượng thao tác trong lan truyền cập nhật

 

Tuy nhiên, lựa chọn đơn vị nhất quán rất nhỏ không phải là một ý tưởng tốt vì số lượng đơn vị nhất quán cần phải quản lý sẽ tăng lên đáng kể, lượng thông tin điểu khiển nhiều hơn và điều đó dẫn đến suy giảm hiệu năng của hệ thống. Lý tưởng, một thao tác được thực hiện trên một bản sao phải được thực hiện ngay lập tức trên các bản sao khác, hoặc ít nhất sau khi thao tác cập nhật đã hoàn thành trên bản sao thì phải được chuyển ngay sang các bản sao khác. Tuy nhiên thực tế sẽ gặp nhiều trở ngại về mạng, nhất là những hệ thống thường xuyên cập nhật, vì vậy quyết định mỗi lần lan truyền cập nhật gồm bao nhiêu thao tác sẽ do người thiết kế hệ thống phần mềm quyết định.

Mặc dù có nhiều biện pháp hay để đạt được các yêu cầu nhất quán nhưng có hai vấn đề quan trọng cần phải giải quyết trong thực tế, đó là việc xây dựng các giao thức nhất quán liên tục và xác định các yêu cầu nhất quán cho các ứng dụng. Thực tế cho thấy, việc duy trì các yêu cầu này rất khó, lập trình viên nói chung không quen xử lý nhân bản., vì vậy cần phải cung cấp giao diện lập trình đơn giản và dễ hiểu. Có thể cài đặt tính nhất quán liên tục trong bộ công cụ dưới dạng thư viện liên kết với các ứng dụng, đơn vị nhất quán sẽ được khai báo bên cạnh các thao tác cập nhật dữ liệu.

8.2.2    Nhất quán theo thứ tự thao tác

Bên cạnh tính nhất quán liên tục, mô hình nhất quán lấy dữ liệu làm trung tâm còn phải giải quyết vô số các nhiệm vụ khác, các tiến trình tính toán phân tán và song song còn phải đương đầu với vấn đề chia sẻ tài nguyên nhưng vẫn đảm bảo tính tương tranh. Nhiều mô hình đã được đưa ra, phần này sẽ đề cập tới mô hình đảm bảo tính nhất quán theo thứ tự các thao tác, chúng làm tăng tính nhất quán liên tục, các bản sao cần phải đạt được sự đồng thuận về thứ tự của các thao tác cập nhật. Các mô hình sẽ đề cập tới trong phần này bao gồm:

-         Mô hình nhất quán nghiêm ngặt

-         Mô hình nhất quán tuần tự

-         Mô hình nhất quán nhân quả

-         Mô hình nhất quán hàng đợi

-         Mô hình nhất quán yếu

-         Mô hình nhất quán đi ra 

-         Mô hình nhất quán đi vào

8.2.2.1     Mô hình nhất quán nghiêm ngặt

Giả sử mục dữ liệu x ban đầu có giá trị là null, ký hiệu Wi(x)a là thao tác tiến trình Pi thực hiện ghi giá trị a lên mục dữ liệu x,  Ri(x)b là thao tác tiến trình Pi thực hiện đọc mục dữ liệu x và cho kết quả b.

(a) Nhất quán nghiêm ngặt

(b) Không nhất quán nghiêm ngặt

Hình 8.4 Mô hình nhất quán nghiêm ngặt

 

Mô hình nhất quán nghiêm ngặt là mô hình trong đó bất kỳ thao tác đọc nào trên mục dữ liệu nào đều trả về một giá trị tương ứng với kết quả của thao tác ghi gần nhất trên mục dữ liệu đó. Định nghĩa trên rất tự nhiên và rõ ràng, mặc dù nó ngầm thừa nhận sự tồn tại của thời gian toàn cục tuyệt đối, đó là thời gian chung cho cả hệ thống để xác định chính xác khái niệm thao tác ghi gần nhất, điều này là khó khả thi với hệ phân tán. Hình 8.4 minh họa tiến trình P1 thực hiện ghi giá trị a vào biến x sau đó lan tỏa sang các bản sao khác. Tiến trình P2  đọc biến x, nếu nhận được giá trị a thì đó đáp ứng yêu cầu mô hình nhất quán nghiêm ngặt, ngược lại sẽ không phải là nhất quán nghiêm ngặt. Như vậy để đảm bảo cho hoạt động của mô hình nhất quán nghiêm ngặt thì không thể thực hiện theo phương pháp cập nhật xong bản gốc rồi mới lan tỏa đến các bản sao vì sẽ tốn thời gian để di chuyển thông điệp. Mô hình nhất quán nghiêm ngặt đòi hỏi tính nguyên tử của các thao tác cập nhật, yêu cầu cập nhật phải đến được tất cả các bản sao ngay lập tức, điều này chỉ có thể thực hiện được bằng các kỹ thuật giao tác phân tán.

8.2.2.2     Mô hình nhất quán tuần tự

Mô hình nhất quán tuần tự được Lamport đề xuất vào năm 1979 trong ngữ cảnh bộ nhớ dùng chung cho các hệ thống nhiều bộ xử lý, kho dữ liệu được coi là nhất quán tuần tự nếu kết quả của bất kỳ tiến trình nào cũng như nhau khi các thao tác được thực hiện theo thứ tự giống nhau. Như vậy nhất quán tuần tự là mô hình lỏng và yếu hơn mô hình nhất quán nghiêm ngặt, nó phải thỏa mãn các yêu cầu sau:

-         Kết quả của thực hiện như nhau nếu thao tác đọc và ghi do các tiến trình thực hiện trên mục dữ liệu một cách tuần tự và các thao tác của mỗi tiến trình xuất hiện trong chuỗi thao tác này do chương trình qui định.

-         Khi các tiến trình chạy đồng thời trên các máy khác nhau thì cho phép sự đan xen của các thao tác nhưng tất cả các tiến trình đều phải nhận biết giống nhau về sự đan xen của các thao tác.

 

Hình 8.5 Mô hình nhất quán tuần tự

 

Mô hình nhất quán tuần tự không đề cập đến yếu tố thời gian, như vậy không cần phải tham chiếu đến thao tác ghi gần nhất lên mục dữ liệu, tiến trình phải nhìn thấy thao tác ghi từ tất cả các tiến trình khác chứ không phải chỉ thao tác ghi của mình. Hình 8.5 (a) minh họa nhất quán tuần tự, tiến trình P1 thực hiện ghi giá trị a vào biến x sau đó tiến trình P2 cũng thực hiện ghi giá trị b vào biến này, các tiến trình P3 và P4 đều đọc được giá trị b sau đó mới đọc được giá trị a, điều đó chứng tỏ thao tác ghi của tiến trình P2 được thực hiện trước thao tác ghi của tiến trình P1. Ngược lại, hình 8.5 (b) cho thấy tiến trình P3 đọc được giá trị b trước giá trị a, trong khi đó tiến trình P4 lại đọc được giá trị a trước giá trị b, điều đó chứng tỏ không thỏa mãn yêu cầu nhất quán tuần tự.

 

Hình 8.6 Ba tiến trình thực hiện tương tranh

 

Để minh họa cho nhất quán tuần tự, hãy xem xét ví dụ ba tiến trình thực hiện tương tranh  trên hình 8.6, các mục dữ liệu được thể hiện bằng ba biến (x, y, z) đều có giá trị ban đầu bằng 0, thao tác gán thể hiện cho lệnh ghi và thao tác in thể hiện cho lệnh đọc. Tuần tự xen kẽ thực hiện với 6 lệnh trên sẽ cho 720 khả năng, mặc dù một số tổ hợp vi phạm thứ tự của chương trình. Nếu xét trường hợp ghi giá trị 1 vào biến x được thực hiện trước thì sẽ có 120 khả năng, trong đó chỉ có 30 khả năng hợp lệ theo thứ tự chương trình.

Hình 8.7 (a) thể hiện thứ tự thực hiện các tiến trình P1, P2 và P3, ba trường hợp còn lại minh họa các khả năng khác nhau về việc xen kẽ các lệnh nhưng vẫn đảm bảo theo đúng thứ tự đã qui định trong chương trình. Nếu tập trung vào kết quả in của các tiến trình theo thứ tự P1, P2 và P3, chúng ta sẽ nhận được xâu ký tự thể hiện chữ ký, như vậy sẽ có 64 khả năng xảy ra nhưng không phải khả năng nào cũng hợp lệ vì cần phải đảm bảo yêu cầu theo đúng thứ tự của chương trình gán giá trị vào biến trước khi thực hiện lệnh in.

(a)

(b)

(c)

(d)

Hình 8.7 Bốn trường hợp nhất quán tuần tự hợp lệ

 

Ví dụ chữ ký 001001 không hợp lệ vì hai bit đầu tiên 00 thể hiện tiến trình P1 được thực hiện đầu tiên, hai bit kế tiếp thể hiện tiến trình P2 thực hiện trước tiến trình P3, hai bit cuối cùng 01 thể hiện tiến trình P3 thực hiện trước tiến trình P1 nên mâu thuẫn với kết luận phân tích hai bit đầu tiên. Như vậy trong số 90 khả năng tổ hợp được coi là hợp lệ sẽ không quá 64 khả năng được phép thực hiện theo quan điểm nhất quán tuần tự, các tiến trình phải chấp nhật các giá trị hợp lệ này.

8.2.2.3     Mô hình nhất quán nhân quả

Mô hình nhất quán nhân quả do Hutto và Ahamad đề xuất vào năm 1990 thể hiện sự nới lỏng nhất quán tuần tự, nó phân biệt các sự kiện có quan hệ nhân quả và các sự kiện không có quan hệ nhân quả. Xét ví dụ về nhân bản cơ sở dữ liệu phân tán trên hình 8.8, tiến trình P1 thực hiện ghi các giá trị vào a và c vào biến x bằng các lệnh W1(x)a và W1(x)c, tiến trình P2 đọc giá trị biến x R2(x) a và thực hiện thao tác W2(x)b để ghi giá trị b vào biến x, dễ dàng nhận thấy quan hệ nhân quả W1(x)a à W1(x)c vì các thao tác ghi đều được thực hiện trên tiến trình P1, R2(x)a à W2(x)b vì thao tác đọc được thực hiện trước thao tác ghi trong tiến trình P2, trong khi đó hai sự kiện W2(x)b và W1(x)c tương tranh với nhau nên chúng không có mối quan hệ nhân quả. Như vậy các tiến trình chỉ cần thực hiện theo thứ tự W1(x)a còn thứ tự thực hiện các lệnh W2(x)b và W1(x)c không quan trọng.

Hình 8.8 Mô hình nhất quán nhân quả

 

Nếu sự kiện B được gây ra hoặc bị tác động bởi một sự kiện a xảy ra sớm hơn thì tính nhân quả đòi hỏi mọi thực thể khác phải nhìn thấy a trước rồi mới thấy b. Mô hình nhất quán nhân quả thỏa mãn các điều kiện sau: các thao tác ghi có quan hệ nhân quả tiềm năng phải được nhận biết bởi tất cả các tiến trình khác trong cùng một thứ tự. Các thao tác ghi không có quan hệ nhân quả thì có thể thực hiện theo thứ tự khác nhau trên các tiến khác nhau.

Hình 8.9 Nhất quán nhân quả và vi phạm tính nhất quán nhân quả

 

Một ví dụ khác trên hình 8.9, tiến trình P1 thực hiện lệnh W1(x)a để ghi giá trị vào biến x, tiến trình P2 thực hiện lệnh W2(x)b để ghi giá trị b vào biến x, tuy nhiên trường hợp (a) tiến trình P2 thực hiện lệnh đọc R2(x)a trước thi thực hiện lệnh ghi, do đó có thể xác định quan hệ nhân quả W1(x)a à W2(x)b, vì vậy trường hợp này không đáp ứng yêu cầu nhất quán nhân quả. Trái lại, trường hợp (b) cho kết quả giống như trường hợp (a) nhưng lại đáp ứng yêu cầu nhân quả vì W1(x)a || W2(x)b. Việc cài đặt nhất quán nhân quả đòi hỏi phải lưu vết những tiến trình đã thực hiện lệnh ghi, cần thiết phải xây dựng đồ thị phụ thuộc, điều này có thể thực hiện bằng cách gán nhãn thời gian vector cho các thao tác.

8.2.2.4     Mô hình nhất quán hàng đợi

Mô hình nhất quán hàng đợi là mô hình yếu hơn mô hình nhất quán chặt nhưng mạnh hơn mô hình nhất quán tuần tự. Mô hình này thỏa mãn điều kiện sau: Kết quả của bất kì sự thực hiện nào là như nhau nếu các thao tác đọc hoặc ghi của tất cả các tiến trình lên dữ liệu được thực hiện môt cách tuần tự và các thao tác của mỗi tiến trình xuất hiện trong chuỗi thao tác này phải theo thứ tự đã được chỉ ra trong chương trình của nó.

Hình 8.10 Mô hình nhất quán hàng đợi

 

Đây là mô hình yếu nhất vì mô hình này bỏ qua giới hạn về trật tự của bất kì thao tác đồng thời nào. Nhất quán hàng đợi thỏa mãn điều kiện các thao tác ghi bởi một tiến trình đơn phải được tất cả các tiến trình khác nhìn thấy theo cùng một trật tự mà chúng đề ra nhưng thao tác ghi bởi nhiều tiến trình khác nhau có thể được thấy theo những trật tự khác nhau. Trong ví dụ trên hình 8.10, mặc dù các tiến trình P3 và P4 đọc được các giá trị theo thứ tự khác nhau nhưng chúng vẫn đảm bảo thao tác cập nhật thứ tự cập nhật các thao tác W(x)b và W(x)c theo đúng thứ tự qui định trong chương trình của tiến trình P2.

8.2.3    Nhất quán theo nhóm các thao tác

Nhất quán tuần tự và nhất quán nhân quả được định nghĩa ở mức độ các thao tác đọc và ghi, cấp độ nhỏ nhất này xuất phát từ lịch sử, ban đầu các mô hình được phát triển cho các hệ thống nhiều bộ xử lý chia sẻ bộ nhớ, chúng thực sự được cài đặt trong phần cứng. Cấp độ rất nhỏ của các mô hình nhất quán trên không phù hợp với mức độ của các ứng dụng, tính tương tranh giữa dữ liệu chia sẻ được điều khiển bằng các cơ chế đồng bộ để loại trừ lẫn nhau và các giao tác, các lệnh đọc và ghi được thực hiện giữa hai thao tác chiếm vùng tới hạn ENTER_CS và rời khỏi vùng tới hạn LEAVE_CS, khi đã vào được vùng tới hạn thì tiến trình có thể an tâm thực hiện chuỗi các lệnh đọc và ghi trên kho dữ liệu.

Về bản chất, điều gì xảy ra bên trong chương trình mà dữ liệu chịu tác động bởi một loạt các thao tác đọc ghi được bảo vệ chống lại những truy nhập tương tranh, đó sẽ không phải là kết quả của việc thực hiện chuỗi các lệnh như một thể thống nhất. Nếu đặt chuỗi các lệnh này vào một đơn vị thực hiện nguyên tử thì sẽ nâng mức độ mịn, để đạt được điều này thì cần phải có ngữ cảnh chính xác liên quan tới các thao tác xâm nhập và thoát khỏi vùng tới hạn, ngữ cảnh này được hình thành dựa trên khái niệm các biến đồng bộ chia sẻ. Một tiến trình muốn vào vùng tới hạn thì phải yêu cầu biến đồng bộ và khi thoát khỏi vùng tới hạn thì phải giải phóng các biến này, dữ liệu trong vùng tới hạn của tiến trình có thể kết hợp với nhiều biến đồng bộ khác nhau.

Mỗi biến đồng bộ có chủ sở hữu hiện hành, cụ thế đó là tiến trình cuối cùng chiếm hữu được biến đó, chủ sở hữu có thể vào và ra khỏi vùng tới hạn liên tục mà không cần phải gửi các thông điệp lên mạng. Một tiến trình muốn chiếm quyền sở hữu biến đồng bộ và thao tác với dữ liệu liên quan tới biến đồng bộ đó thì phải gửi thông điệp đến chủ sở hữu hiện hành. Một số tiến trình cũng có thể đồng sở hữu biến đồng bộ trong chế độ không độc quyền, chúng chỉ đọc chứ không ghi vào dữ liệu liên quan tới biến đồng bộ đó. Bershad năm 1993 đã chỉ ra ba yêu cầu cần phải đáp ứng:

1.      Các tiến trình không được phép truy nhập vào biến đống bộ cho đến khi tiến trình đang sở hữu biến đồng bộ hoàn thành tất cả các thao tác cập nhật lên dữ liệu chia sẻ đã được bảo vệ cho tiến trình đó.

2.      Trước khi truy nhập biến đồng bộ chế độ độc quyền thì không một tiến trình nào có thể chiếm giữ biến đồng bộ, thậm chí việc chiếm giữ biến đồng bộ đó trong chế độ không độc quyền.

3.      Sau khi một tiến trình đã truy nhập biến đồng bộ ở chế độ độc quyền thì các tiến trình khác không được thực hiện truy nhập biến đồng bộ ở chế độ không độc quyền cho đến khi tiến trình đang chiếm giữ biến đồng bộ hoàn thành công việc.

Điều kiện thứ nhất nói rằng, khi một tiến trình chiếm hữu biến đồng bộ thì việc chiếm hữu đó có thể chưa hoàn thành cho đến khi tất cả các dữ liệu được bảo vệ đã hoàn thành cập nhật. Điều kiện thứ hai ngụ ý trước khi cập nhật mục dữ liệu chia sẻ thì tiến trình phải vào vùng tới hạn ở chế độ độc quyền để đảm bảo rằng không một tiến trình nào khác có thể thay đổi mục dữ liệu chia sẻ trong cùng thời gian đó. Điều kiện thứ ba nói rằng nếu một tiến trình muốn vào vùng tới hạn trong chế độ không độc quyền thì đầy tiên phải kiểm tra với chủ sở hữu của biến đồng bộ bảo vệ vùng tới hạn để lấy bản sao gần nhất của dữ liệu chia sẻ được bảo vệ.

8.2.3.1     Mô hình nhất quán yếu

Mặc dù mô hình nhất quán hàng đợi đã có hiệu năng tốt hơn các mô hình trước nhưng nó vẫn có một số hạn chế không cần thiết đối với các ứng dụng bởi vì nó đòi hỏi các thao tác ghi phát sinh từ một tiến trình phải được các tiến trình khác nhìn thấy theo đúng trình tự. Ví dụ một tiến trình trong vùng tới hạn đang đọc và ghi một số biến trong vòng lặp, một số tiến trình không cho rằng có thể tiếp cận các biến này cho đến khi tiến trình thứ nhất rời khỏi vùng tới hạn, bộ nhớ không biết chắc khi nào tiến trình ở trong vùng tới hạn và do đó nó sẽ lan tỏa thao tác ghi đến các bộ nhớ theo cách thông thường. Mô hình nhất quán yếu không tập trung vào các thao tác trên dữ liệu như các mô hình trên mà chúng quan tâm đến trật tự các nhóm lệnh bằng việc sử dụng các biến đồng bộ, năm 1986 Dubois đã định nghĩa ba đặc tính của mô hình nhất quán yếu như sau:

-         Việc truy cập đến một biến đồng bộ là nhất quán tuần tự.

-         Không có thao tác nào lên các biến đồng bộ được phép thực hiện cho đến khi tất cả các thao tác ghi trước đó được hoàn thành ở mọi nơi.

-         Không có thao tác đọc hay ghi dữ liệu lên các mục dữ liệu nào được phép thực hiện cho đến khi tất cả các thao tác trước đó lên các biến đồng bộ được thực hiện.

Hình 8.11 Mô hình nhất quán yếu

 

Xét ví dụ trên hình 8.11, tiến trình P1 thực hiện hai lệnh ghi liên tiếp W1(x)a và W1(x)b sau đó thực hiện đồng bộ, trên hình vẽ ký hiệu bằng chữ S. Trường hợp (a), hai tiến trình P2 và P3 thực hiện các lệnh đọc sau đó mới đồng bộ nên thứ tự của chúng khác nhau nhưng vẫn được coi là đáp ứng yêu cầu của mô hình nhất quán yếu. Trường hợp (b), tiến trình P2 thực hiện đồng bộ sau đó mới đọc giá trị của biến x, như vậy có thể coi tiến trình P2 đã được đồng bộ nên giá trị đọc được của biến x phải là b, do đó có thể coi như không đáp ứng yêu cầu mô hình nhất quán yếu.

8.2.3.2     Mô hình nhất quán đi ra

Trong mô hình nhất quán yếu, khi đã truy nhập được biến đồng bộ thì không biết được khi nào tiến trình mới hoàn thành việc đọc hoặc ghi dữ liệu, kết quả là cần phải thực hiện động tác để đảm bảo chắc chắn các cập nhật cục bộ đều đã hoàn thành. Nếu các tiến trình có thể cho biết việc thâm nhập và rời khỏi vùng tới hạn thì việc cài đặt sẽ hiệu quả hơn có thể thực hiện được, cần thiết phải có hai biến đồng bộ chứ không phải là một biến.

Mô hình nhất quán đi ra sử dụng lệnh chiếm giữ Acq để có thể vào vùng tới hạn và lệnh giải phóng Rel để ra khỏi vùng tới hạn, hai lệnh này được thực hiện bằng các thao tác theo thứ tự trên các biến hoặc bằng các thao tác đặc biệt, chúng chỉ thực hiện với các dữ liệu dùng chung chứ không áp dụng cho tất cả các dữ liệu. Việc truy nhập vào các biến đồng bộ hóa là nhất quán hàng đợi, không yêu cầu nhất quán tuần tự.

Hình 8.12 Mô hình nhất quán đi ra

 

Mô hình nhất quán đi ra thỏa mãn các điều kiện sau:

-         Trước khi thực hiện một thao tác đọc hay ghi lên dữ liệu chia sẻ thì tất cả các thao tác chiếm giữ do tiến trình này thực hiện trước đó phải được hoàn tất.

-         Trước khi một thao tác giải phóng Rel được phép thực hiện thì tất cả các thao tác đọc và ghi do tiến trình này thực hiện trước đó phải được hoàn tất.

Hình 8.12 minh họa mô hình nhất quán đi ra, tiến trình P1 gửi yêu cầu chiếm giữ và thực hiện cập nhật các mục dữ liệu, khi cập nhật xong dữ liệu trên bản sao cục bộ mới lan tỏa cập nhật tới các bản sao khác.

8.2.3.3     Mô hình nhất quán đi vào

Mô hình nhất quán đi vào cũng sử dụng hai lệnh chiếm giữ Acq và lệnh giải phóng Rel khi muốn vào vùng tới hạn, thay cho việc khóa toàn bộ dữ liệu chia sẻ thì chỉ kết hợp khóa với mỗi mục dữ liệu, các lệnh này thao tác trên từng mục dữ liệu của vùng dữ liệu chia sẻ. Tiến trình nào muốn sử dụng mục dữ liệu thì phải đợi cho tất cả các tiến trình khác giải phóng mục dữ liệu đó. Hình 8.12 minh họa nhất quán đi vào, tiến trình P1 yêu cầu chiếm giữ và ghi giá trị a vào biến x sau đó tiếp tục chiếm giữ và thay ghi giá trị b vào biến y, cuối cùng giải phóng hai biến này. Tiến trình P2 gửi yêu cầu chiếm giữ để đọc giá trị của biến x sau khi tiến trình P1 đã giải phóng biến này nhưng chưa giải phòng biến y, do đó P2 đọc được giá trị a và nếu đọc biến y thì có thể sẽ nhận được giá trị null. Tiến trình P3 gửi yêu cầu chiếm giữ để đọc biến y sau khi tiến trình P1 giải phóng biến y và vì vậy nó nhận được giá trị b.

Hình 8.12 Mô hình nhất quán đi vào

 

Vấn đề của nhất quán đi vào là phải kết hợp chính xác dữ liệu với biến đồng bộ, trong cách tiếp cận dựa trên đối tượng chúng ta có thể kết hợp biến đồng bộ với đối tượng và thực hiện tuần tự hóa khi gọi các đối tượng này. Nếu không sử dụng cách tiếp cận trên thì có thể thông báo tường minh những dữ liệu nào sẽ bị ảnh hưởng khi thực hiện giao tác. Để ghi lên một mục dữ liệu, máy khách phải có được biến đồng bộ của mục đó trong chế độ dành riêng, điều này có nghĩa là không máy khách nào khác có thể sử dụng biến đó, khi máy khách cập nhật xong mục dữ liệu thì nó giải phóng biến đó. Khi máy khách muốn đọc một mục dữ liệu nào đó, nó phải có được biến đồng bộ hóa kết hợp ở chế độ không dành riêng, nhiều máy khách có thể giữ biến đồng bộ hóa ở chế độ không dành riêng. Khi thực hiện một thao tác chiếm giữ Acq, máy khách lấy về phiên bản mới nhất của mục dữ liệu từ tiến trình cuối cùng thực hiện thao tác chiếm giữ trên biến đó. Nhất quán đi vào phải thỏa mãn các điều kiện sau:

-         Một thao tác chiếm giữ Acq để truy cập vào một biến đồng bộ hóa không được phép thực hiện trong một tiến trình cho đến khi tất cả các cập nhật lên mục dữ liệu trong tiến trình đó được thực hiện.

-         Trước khi một truy cập trong chế độ dành riêng của một tiến trình tới một biến đồng bộ được phép thực hiện thì không tiến trình nào khác còn được giữ các biến đồng bộ, trong chế độ không dành riêng thì không cần yêu cầu như vậy.

Sau khi một truy cập trong chế độ dành riêng lên một biến đồng bộ hóa được thực hiện thì bất kì sự truy nhập của tiến trình nào khác trong chế độ không dành riêng lên biến đó cũng không được thực hiện cho đến khi chủ nhân của biến đồng bộ thực hiện xong việc truy cập của mình.

8.2.4    Tính nhất quán gắn kết

Tại thời điểm này cần thiết phải làm rõ sự khác biệt giữa hai khái niệm liên quan mật thiết với nhau, các mô hình nhất quán đề cập trong các phần trước  thực tế đã giải quyết vấn đề các tiến trình thực hiện thao tác đọc và ghi trên tập các mục dữ liệu, chúng mô tả kết quả mong đợi khi nhiều tiến trình đồng thời thực hiệc các thao tác trên dữ liệu, sẽ nhất quán nếu tuân thủ các qui tắc đã đề ra cho mô hình. Các mô hình gắn kết mô tả kết quả mong đợi đối với từng mục dữ liệu, trong trường hợp này dữ liệu được nhân bản ở nhiều nơi, chúng được coi là gắn kết khi các bản sao tuân thủ qui tắc đã định nghĩa trong mô hình gắn kết. Mô hình phổ biến về gắn kết là mô hình nhất quán tuần tự nhưng chỉ áp dụng cho một mục dữ liệu, nghĩa là trong trường hợp các yêu cầu cập nhật xảy ra đồng thời thì tất cả các tiến trình sẽ nhìn thấy cùng một thứ tự thực hiện các yêu cầu cập nhật.

8.3       Nhất quán lấy máy khách làm trung tâm

Các mô hình nhất quán lấy dữ liệu làm trung tâm cung cấp cách nhìn nhất quán tổng thể về việc lưu trữ dữ liệu, nó giải quyết vấn đề nhiều tiến trình liên tục cập nhật tương tranh trên dữ liệu. Khả năng điều khiển tương tranh trên dữ liệu chia sẻ nhưng vẫn duy trì được tính nhất quán tuần tự là một trong những nhiệm vụ cơ bản của các hệ thống phân tán, tính nhất quán tuần tự được đảm bảo khi và chỉ khi sử dụng cơ chế đồng bộ, vì lý do hiệu năng nên sẽ phải sử dụng một số mô hình khác. Phần này giới thiệu mô hình nhất quán lấy máy khách làm trung tâm với giả thiết hệ thống chủ yếu thực hiện đọc dữ liệu và ít khi xảy ra hiện tượng cập nhật liên tục, nếu có thì cũng dễ dàng giải quyết. Các kho dữ liệu cung cấp mô hình nhất quán rất yếu, tính không nhất quán sẽ được che giấu bằng các biện pháp tương đối đơn giản:

-         Mô hình nhất quán sau cùng

-         Mô hình nhất quán đọc đều

-         Mô hình nhất quán ghi đều

-         Mô hình nhất quán đọc kết quả ghi

-         Mô hình  nhất quán ghi theo sau đọc

8.3.1    Mô hình nhất quán sau cùng

Trong nhiều hệ thống cơ sở dữ liệu, hầu hết các tiến trình thực hiện đọc chứ ít khi thực hiện các thao tác ghi, như vậy xung đột ghi/ghi hiếm khi xảy ra mà chủ yếu phải giải quyết vấn đề xung đột đọc/ghi. Nếu một tiến trình cập nhật dữ liệu và nhiều tiến trình đang cần đọc thì phải giải quyết là làm sao các thao tác ghi được thực hiện nhanh nhất để cung cấp kết quả cho các tiến trình chỉ đọc, vậy tính nhất quán cần hoàn toàn có thể bị vi phạm. Nếu trong một khoảng thời gian dài mà không xuất hiện lệnh cập nhật thì các bản sao sẽ dần dần trở nên nhất quán, loại nhất quán này gọi là nhất quán sau cùng.

Nhất quán sau cùng sẽ hoạt động tốt nếu máy khách chỉ truy nhập đến một bản sao, vấn đề sẽ nảy sinh khi máy khách thực hiện cập nhật tại một bản sao và trong thời gian ngắn chuyển sang bản sao khác. Trường hợp máy khách là thiết bị di động, việc thực hiện yêu cầu trên gặp khó khăn hơn, phải luôn đảm bảo rằng ngay cả khi máy khách thay đổi về vị trí vật lý thì việc sử dụng các bản sao cũng phải chính xác, tức là các bản sao luôn nhất quán. Ví dụ trên hình 8.13, người dùng sử dụng máy tính kết nối mạng không dây, việc kết nối đến bản sao nào hoàn toàn trong suốt đối với người sử dụng, sau khi cập nhật tại một bản sao người dùng di chuyển sang vị trí khác và hoàn toàn có khả năng phần mềm ứng dụng có thể kết nối đến bản sao chưa kịp cập nhật. Sau các thao tác cập nhật thì tất cả các bản sao đều phải giống nhau, yêu cầu này sẽ được thực hiện tốt nếu mỗi máy khách luôn chịu khó cập nhật cho các bản sao. Việc cập nhật các bản sao ngay sau khi cập nhật bản chính có thể kéo dài thời gian thực hiện, do đó lập trình viên cần dự đoán thời gian thực hiện mỗi yêu cầu và lựa chọn phương án thích hợp.

Hình 8.13 Mô hình nhất quán sau cùng

 

Vấn đề trên có thể giảm bớt bằng cách sử nhất quán lấy máy khách làm trung tâm, nó đảm bảo tính nhất quán cho một máy khách chứ không đảm bảo nhất quán cho các máy khách khác nhau. Về cơ bản, máy khách sẽ chỉ kết nối đến một bản sao, bản sao đó có thể cài đặt cục bộ, mọi thao tác đều được thực hiện trên bản sao này, các thao tác cập nhật sẽ được lan tỏa đến các bản sao khác trong hệ thống.

8.3.2    Mô hình nhất quán đọc đều

Mô hình nhất quán đọc đều phải đảm bảo điều kiện tiến trình thực hiện thao tác đọc trên một mục dữ liệu thì những thao tác đọc tiếp theo sẽ cho kết quả không cũ hơn kết quả lần trước. Máy khách sẽ không bao giờ phải nhìn thấy những dữ liệu cũ hơn những gì mà mình đã đọc trước đó, điều này có nghĩa là khi máy khách thực hiện một thao tác đọc trên một bản sao rồi tiếp theo lại đọc trên một bản sao khác thì bản sao thứ hai ít nhất cũng phải được ghi giống với bản sao đầu tiên.

 

(a) Nhất quán đọc đều

(b) Không đảm bảo nhất quán đọc đều

Hình 8.14 Mô hình nhất quán đọc đều

 

Hình 8.14 minh họa ví dụ về hệ thống lưu trữ gồm hai bản sao L1 và L2, ký hiệu WS(xi) là thao tác ghi xi vào mục dữ liệu, WS(xi ,xi+1) là thao tác bao gồm cả thao tác ghi xi vào mục dữ liệu. Trường hợp (a), tiến trình cập nhật dữ liệu lên bản sao L1 sau đó lan tỏa đến bản sao L2, tại bản sao L2, thao tác ghi x1 là phần đầu của thao tác WS(x1 ,x2) nên máy khách đọc bản sao trên L2 chắc chắn sẽ nhận được giá trị x2 , như vậy thỏa mãn yêu cầu nhất quán đọc đều. Trường hợp (b) bản sao L2 chỉ thực hiện thao tác ghi WS(x2) sau đó đọc được giá trị x2, tuy nhiên thao tác WS(x1) chưa được thực hiện trên L2 nên không có gì đảm bảo sau này không đọc được giá trị x1, vì vậy trường hợp này không đáp ứng yêu cầu nhất quán đọc đều.

8.3.3    Mô hình nhất quán ghi đều

Trong nhiều trường hợp, thứ tự thực hiện các thao tác cập nhật của một tiến trình phải được lan tỏa đến các bản sao theo đúng thứ tự. Mô hình nhất quán ghi đều phải đảm bảo điều kiện thao tác ghi lên mục dữ liệu x của một tiến trình phải được hoàn thành trước bất kỳ một thao tác ghi nào khác trên x bởi cùng tiến trình đó, nói cách khác các thao tác ghi của một tiến trình lên một mục dữ liệu sẽ được sắp xếp  theo thứ tự đã đề ra trong tiến trình.

 

(a) Nhất quán ghi đều

(b) Không đảm bảo nhất quán ghi đều

Hình 8.15 Mô hình nhất quán ghi đều

 

Như vậy, nhất quán ghi đều giống như nhất quán hàng đợi trong trường hợp áp dụng cho một tiến trình. Ví dụ trên hình 8.15 tiến trình thực hiện thao tác cập nhật W(x1) và WS(x2), trường hợp (a) bản sao L3 nhận thực hiện cả hai lệnh này theo thứ tự nên nó đáp ứng yêu cầu nhất quán ghi đều. Trường hợp (b) bản sao L2 chỉ thực hiện lệnh cập nhật W(x2), như vậy lệnh cập nhật W(x1) có thể sẽ đến sau và do đó  không đảm bảo yêu cầu nhất quán ghi đều.

8.3.4    Nhất quán đọc kết quả ghi

Trong mô hình nhất quán này, người dùng được đảm bảo rằng sẽ luôn được nhìn thấy những kết quả ghi mới nhất. Mô hình nhất quán đọc kết quả ghi phải thỏa mãn điều kiện kết quả thao tác ghi của một tiến trình lên mục dữ liệu x sẽ luôn được nhìn thấy bởi một thao tác đọc kế tiếp tiến trình đó trên x, nói cách khác thao tác ghi phải được hoàn thành trước bất kỳ thao tác đọc kế tiếp nào của cùng tiến trình ở bất cứ bản sao nào. Mô hình nhất quán đọc kết quả ghi gần giống với mô hình nhất quán đọc đều, điểm khác biệt chỉ ở chỗ tính nhất quán bây giờ được quyết định bằng thao tác ghi của tiến trình chứ không phải thao tác đọc.

(a) Nhất quán đọc kết quả ghi

(b) Không đảm bảo nhất quán đọc kết quả ghi

Hình 8.16 Mô hình nhất quán đọc kết quả ghi

 

Ví dụ trường hợp máy chủ web sử dụng cơ chế cache, khi biên tập viên đã hoàn thành cập nhật bài viết nhưng người dùng vẫn không nhìn thấy nội dung mới cập nhật, nguyên nhân là do máy chủ web trả về giá trị lưu trong cache. Nhất quán đọc kết quả ghi đảm bảo rằng khi biên tập viên cập nhật nội dung của mục dữ liệu thì cache cũng được cập nhật. Hình 8.16 minh họa tiến trình thực hiện thao tác ghi W(xi) sau đó thực hiện thao tác đọc R(xi) trên bản sao khác, trường hợp (a) thao tác W(x1;x2) thể hiện thao tác ghi W(x1) là một phần của thao tác ghi W(x2), trường hợp (b) thể hiện thao tác ghi W(x1) chưa được lan tỏa đến bản sao L2 do đó không đảm bảo tính nhất quán giữa hai bản sao này.

8.3.5    Nhất quán ghi sau khi đọc

Mô hình nhất quán ghi sau khi đọc đảm bảo rằng người dùng sẽ luôn thực hiện thao tác ghi lên một mục dữ liệu mà ít nhất cũng phải mới hơn phiên bản cuối cùng của mục dữ liệu đó, lan truyền cập nhật phải dựa trên kết quả đọc.

(a) Nhất quán ghi sau khi đọc

(b) Không đảm bảo nhất quán ghi sau khi đọc

Hình 8.17 Mô hình nhất quán ghi sau khi đọc

 

Hình 8.17 minh họa tiến trình thực hiện thao tác ghi W(xi) sau đó thực hiện thao tác đọc R(xi) trên bản sao khác, trường hợp (a) thao tác W(x1;x2) thể hiện thao tác ghi W(x1) đã được lan tỏa đến bản sao L2, tiến trình đọc được kết quả thao tác ghi W(x1) sau đó mới thực hiện thao tác ghi W(x2). Trường hợp (b) thể hiện thao tác ghi W(x1) chưa được lan tỏa đến bản sao L2 do đó không đảm bảo tính nhất quán giữa hai bản sao này. Có thể lấy ví dụ về thảo luận nhóm, các thành viên chỉ có thể đưa ra góp ý sau khi đã nhìn thấy chủ đề thảo luận.

8.4       Quản lý các bản sao

Trước khi nhân bản trong các hệ thống phân tán cần phải trả lời các câu hỏi: ở đâu, khi nào  và cho ai và sau đó là các cơ chế dùng để duy trì tính nhất quán của các bản sao. Câu hỏi đặt bản sao ở đâu sẽ gồm hai phần: vị trí máy chủ của bản sao và nội dung được lưu trữ trên bản sao đó, sự khác biết không dễ mô tả nhưng quan trọng và chúng không tách biệt nhau một cách rõ ràng. Vị trí đặt máy chủ bản sao liên quan tới việc tìm kiếm vị trí tốt nhất để đặt máy chủ lưu trữ dữ liệu, nội dung được lưu trữ liên quan đến vấn đề tìm kiếm máy chủ tốt nhất để lưu trữ nội dung, thông thường đó là tìm kiếm vị trí tối ưu cho mục dữ liệu.

8.4.1    Vị trí máy chủ bản sao

Lựa chọn vị trí đặt máy chủ bản sao dựa trên kết quả phân tích các thuộc tính về mạng và máy khách sao cho độ trễ truyền thông giữa máy chủ và máy khách có thể đạt giá trị thấp nhất. Tuy nhiên trong thực tế còn phải tính đến các vấn đề thương mại chứ không phải chỉ đơn thuần vấn đề tối ưu truyền thông khách/chủ. Có nhiều cách khác nhau để tính toán vị trí tốt nhất đặt các máy chủ bản sao nhưng tựu chung lại đều là vấn đề tối ưu tìm ra K vị trí tốt nhất trong số N vị trí, những vấn đề tính toán này phức tạp và chỉ có thể được giải quyết thông qua kinh nghiệm. Ví dụ có thể lấy khoảng cách giữa máy khách và máy chủ để làm tiêu chí nhưng cũng có thể lấy tiêu chí tối ưu là vùng tự trị, các thuật toán này đều có chi phí tính toán cao. Năm 2006 Szymaniak đề xuất giải pháp bản sao theo khu vực, một khu vực được xác định bằng tập các nút truy nhập cùng nội dung, tuy nhiên cần phải tính toán sao cho hạn chế sự phân mảnh nội dung.

8.4.2    Bản sao nội dung và vị trí

Bản sao nội dung có thể chia thành ba loại: bản sao thường trực,  bản sao khởi đầu từ máy chủ và các bản sao khởi đầu từ máy khách.

Hình 8.18 Phân loại bản sao dữ liệu

8.4.2.1     Bản sao thường trực

Các bản sao thường trực có thể coi như tập khởi đầu của các bản sao, chúng tạo nên kho dữ liệu phân tán. Số lượng các bản sao thường trực thường nhỏ, ví dụ khi cài đặt trang web có thể tổ chức theo hai cách: nhóm máy chủ web hoặc phân tán máy chủ. Cách thứ nhất sao các tập tin của trang web lên các nhóm các máy chủ, khi có yêu cầu gửi đến thì sẽ sử dụng chiến lược round-robin để chuyển tới một trong các máy chủ xử lý. Cách thứ hai là dùng cơ chế phản chiếu, trang web sẽ được nhân bản lên một số máy chủ phân bố dựa theo vị trí địa lý trên toàn mạng Internet, máy khách lựa chọn một trong các máy chủ để truy nhập trang web.

8.4.2.2     Bản sao khởi nguồn từ máy chủ

Bản sao khởi nguồn từ máy chủ được sử dụng để làm tăng hiệu năng và chúng được tạo ra xuất phát từ yêu cầu của kho dữ liệu, các bản sao này được xếp đặt động dựa vào yêu cầu của máy chủ khác. Ví dụ máy chủ web đặt tại một vị trí, bình thường vẫn xử lý các yêu cầu nhưng quản trị viên nhận thấy có sự tăng trưởng đột ngột từ một khu vực nào đó, như vậy có thể nhân bản  trang web tạm thời lên các máy chủ ở những khu vực có nhiều người truy nhập, quyết định đặt nội dung ở đâu sẽ dễ dàng hơn quyết định đặt máy chủ. Giải thuật nhân bản động giải quyết hai vấn đề: giảm tải cho máy chủ và đưa thông tin cần thiết gần với vị trí của người dùng, mỗi máy chủ lưu vết truy nhập của người dùng, dựa trên thông tin về nội dung và vị trí truy nhập có thể quyết định máy chủ nào gần với người dùng nhất. Trên hình 8.19, tập tin F đặt tại máy chủ Q nhưng nhiều người dùng truy nhập đến tập tin này phải đi qua máy chủ P, nếu số lượng truy nhập qua P lớn hơn ngưỡng nhân bản thì sẽ tạo bản sao tập tin F trên máy chủ P. Nếu số lượng truy nhập đến tập tin F trên máy chủ Q không vượt qua ngưỡng xóa thì hoàn toàn có thể loại bỏ tập tin này trên máy chủ Q, như vậy sẽ giảm số lượng các bản sao.

Hình 8.19 Đếm số lượng yêu cầu từ máy khách

 

Ngưỡng nhân bản luôn có giá trị lớn hơn ngưỡng xóa, số lượng yêu cầu lớn hơn ngưỡng nhân bản nghĩa là sẽ tốt hơn nếu đặt tài nguyên trên máy chủ khác. Nếu số lượng yêu cầu nằm trong khoảng ngưỡng xóa và ngưỡng nhân bản thì nên tạo thêm bản sao cho tài nguyên. Tuy nhiên việc di chuyển tài nguyên có kích thước lớn từ máy chủ này sang máy chủ khác không phải lúc nào cũng thực hiện được, trong trường hợp này phải thực hiện cơ chế nhân bản. Bản sao thường trực vẫn thường được sử dụng với mục đích dự phòng hoặc với mục đích đảm bảo tính nhất quán, các bản sao khởi nguồn từ máy chủ dùng để thay thế các bản sao chỉ đọc cho máy khách.

8.4.2.3     Bản sao khởi nguồn từ máy khách

Một loại bản sao quan trọng là bản sao khởi nguồn từ máy khách, chúng được tạo ra từ yêu cầu của những ứng dụng nằm trên chính máy khách, chẳng hạn như việc ghi nhớ dữ liệu cache, bản chất đó là vùng nhớ để máy khách tạm thời lưu dữ liệu vừa yêu cầu. Về nguyên tắc, việc quản lý cache hoàn toàn dành cho máy khách, kho dữ liệu không có việc gì phải duy trì tính nhất quán, tuy nhiên trong nhiều trường hợp máy khách có thể dựa vào sự tham gia của kho dữ liệu để thông báo cho nó khi nào dữ liệu cache đã cũ. Dữ liệu cache của máy khách dùng để cải thiện thời gian truy nhập dữ liệu, chúng được xếp đặt động tùy thuộc vào yêu cầu của người sử dụng các ứng dụng trên máy khách. Bình thường khi máy khách truy nhập dữ liệu nào đó, nó kết nối đến bản sao gần nhất của kho dữ liệu đã lấy ra và muốn đọc hoặc nơi nó đã thay đổi. Nếu là hệ thống khai phá dữ liệu, hiệu năng có thể cải thiện bằng cách cho phép máy khách lưu dữ liệu đã yêu cầu trong cache ở vị trí gần, như vậy có thể lưu trên chính máy khách hoặc trên máy tính trong mạng cục bộ cùng với máy khách, những lần kế tiếp dữ liệu sẽ được lấy từ cache cục bộ, phương pháp này sẽ hoạt động tốt nếu không có bất kỳ sự thay đổi dữ liệu nào trong khoảng thời gian đó. Nói chung dữ liệu trong cahe được giữ một thời gian nhất định để tránh dữ liệu quá cũ hoặc để dành bộ nhớ cho các máy khách khác.

8.4.3    Phân phát nội dung

Quản lý bản sao cũng phải giải quyết vấn đề lan truyền cập nhật nội dung đến các máy chủ nhân bản tương ứng, phần này sẽ giới thiệu các phương pháp thực hiện yêu cầu này.

8.4.3.1     Trạng thái và thao tác

Vấn đề quan trọng liên quan đến những gì cần phải lan tỏa, về cơ bản có ba khả năng sau:

-         Lan truyền thông báo đã xuất hiện thao tác cập nhật

-         Truyền dữ liệu cập nhật từ bản sao này tới một bản sao khác

-         Lan truyền thao tác cập nhật tới các bản sao khác

Lan truyền thông báo đã xuất hiện thao tác cập nhật là những giao thức thông báo mất hiệu lực, các bản sao được thông báo đã xuất hiện thao tác cập nhật và dữ liệu trên các bản sao đó không còn hiệu lực, nó có thể xác định phần nào của kho dữ liệu đã được cập nhật và như vậy chỉ có một phần của bản sao thực sự đã mất hiệu lực. Bất cứ khi nào yêu cầu thao tác cập nhật bản sao mất hiệu lực, bản sao đó nói chung cần được cập nhật đầu tiên, phụ thuộc vào mô hình nhất quán cụ thể được hỗ trợ. Ưu điểm chính của phương pháp này là lượng thông tin nhỏ nên sử dụng ít băng thông, chỉ có thông tin xác định những dữ liệu nào không còn hiệu lực được truyền đi. Các giao thức loại này hoạt động tốt khi số lượng các thao tác cập nhật lớn hơn rất nhiều so với các thao thác đọc, nghĩa là tỉ lệ thao tác đọc so với thao tác ghi tương đối nhỏ. Phương pháp này cũng phù hợp với những trường hợp dung lượng cần cập nhật lớn, chuyển dữ liệu đến các bản sao sẽ phải chi phí lượng lớn thời gian và như vậy sẽ ảnh hưởng đến hiệu năng của hệ thống. Ví dụ trường hợp hai cập nhật liên tiếp xảy ra trên một bản sao, kết quả thao tác cập nhật thứ hai sẽ ghi đè lên kết quả cập nhật thứ nhất, do đó việc thông báo cập nhật sẽ hiệu quả hơn nhiều so với việc chuyển dữ liệu cập nhật.

Truyền dữ liệu đã bị thay đổi giữa các bản sao là khả năng lựa chọn thứ hai, nó  thực hiện tốt khi tỉ lệ thao tác đọc so với thao tác ghi tương đối cao. Trong trường hợp xác xuất cập nhật cao và áp dụng mô hình nhất quán đọc trước khi ghi thì có thể ghi lại những thay đổi và chỉ truyền những thay đổi đó để tiết kiệm băng thông, hơn nữa có thể tập hợp chúng thành một thông điệp và truyền đi, như vậy cũng sẽ tiết kiệm thông tin điều khiển. Giải pháp thứ ba không truyền dữ liệu đã thay đổimar báo cho mỗi bản sao biết cần phải thực hiện thao tác cập nhật nào, chỉ truyền đi những giá trị của tham số cân thiết cho những thao tác đó. Cách tiếp cận này còn gọi là nhân bản chủ động, với giả thiết mỗi bản sao đại diện cho tiến trình có khả năng đảm bảo dữ liệu có liên quan sẽ được cập nhật bằng cách thực hiện các thao tác. Ưu điểm của phương pháp này là việc lan truyền cập nhật có thể được thực hiện với chi phí băng thông tối thiểu, dung lượng dữ tham số liên quan tới thao tác tương đối nhỏ. Hơn nữa các thao tác có thể phức tạp tùy ý, điều này cho phép cải thiện hơn nữa trong việc giữ tính nhất quán của các bản sao. Mặt khác mỗi bản sao có thể đáp ứng năng lực xử lý lớn hơn, đặc biệt trong những trường hợp các thao tác tương đối phức tạp.

8.4.3.2     Các giao thức kéo và đẩy

Một vấn đề khác khi thiết kế cơ chế nhân bản nội dung là lựa chọn phương thức kéo hay phương thức đẩy. Cách tiếp cận đẩy còn gọi là giao thức dựa trên máy chủ, các cập nhật được lan truyền đến các bản sao mà không cần gửi yêu cầu cập nhật. Giải pháp này thường được sử dụng cho các bản sao thường trực và các bản sao khởi nguồn từ máy chủ, nó cũng được sử dụng cho các bản sao khởi nguồn từ máy khách. Nói chung, giao thức dựa trên máy chủ được áp dụng cho các bản sao cần duy trì mức độ nhất quán tương đối cao, cần phải giữ các bản sao y hệt nhau. Nhu cầu về mức độ nhất quán cao liên quan tới thực tế các bản sao thường trực và các bản sao khởi nguồn từ máy chủ cũng như dữ liệu cache của nhiều máy khách chủ yếu thực hiện thao tác đọc, nghĩa là tỉ lệ thao tác đọc so với thao tác cập nhật tương đối cao, do đó giao thức đẩy cập nhật sẽ hiệu quả vì nó làm cho dữ liệu nhất quán ngay khi có yêu cầu.

Cách tiếp cận kéo cập nhật còn gọi là giao thức dựa trên máy khách, máy chủ hoặc máy khách yêu cầu máy chủ khác gửi cho nó các cập nhật còn tồn đọng, phương pháp này thường dùng cho các bản sao khởi nguồn từ máy khách. Ví dụ cơ chế cache, khi có yêu cầu từ máy khách gửi đến, cache sẽ hỏi máy chủ xem dữ liệu đang lưu trong nó có bị thay đổi hay không, nếu không có thay đổi thì nó sẽ chuyển ngay dữ liệu cho máy khách, nếu có thay đổi thì phải lấy dữ liệu mới đưa vào cache sau đó mới trả về cho máy khách, nói cách khác máy khách đã thăm dò máy chủ để biết có cần phải cập nhật hay không. Cách tiếp cận kéo sẽ hiệu quả khi tỉ lệ giữa thao tác đọc và thao thác ghi tương đối thấp, đó thường là trường hợp cache riêng của máy khách hoặc cache chung của nhiều máy khách nhưng ít chia sẻ các mục dữ liệu. Nhược điểm cơ bản của cách tiếp cận kéo so với cách tiếp cận đẩy là thời gian trả lời sẽ tăng lên trong trường hợp mất cache, hai cách tiếp cận này có những điểm khác biệt như sau:

Vấn đề

Đẩy

Kéo

Trạng thái trên máy chủ

Danh sách các bản sao

Không cần

Thông điệp trao đổi

Cập nhật

Thăm dò và cập nhật

Thời gian trả lời

Ngay lập tức hoặc thời gian lấy dữ liệu

Thời gian lấy dữ liệu

Một vấn đề quan trọng trong giao thức đẩy, máy chủ phải lưu vết tất cả cache của máy khách, bên cạnh khả năng chịu lỗi của máy chủ sẽ thấp hơn thì việc duy trì cache của các máy khách cũng làm tăng đắng kể lượng thông tin điều khiển. Ví dụ trường hợp máy chủ web, khi cập nhật trang thì máy chủ sẽ phải thực hiện cập nhật toàn bộ cache của máy khách, điều này làm tăng đáng kể lưu lượng truyền thông. Thông điệp trao đổi giữa máy khách và máy chủ cũng khác nhau, trong cách tiếp cận đẩy thì chỉ có máy chủ gửi các thao tác cập nhật cho máy khách, chỉ khi nào đó là những yêu cầu cập nhật thì máy khách mới phải lấy những dữ liệu đã thay đổi. Trong cách tiếp cận kéo, máy khách phải thăm dò máy chủ xem có cần thiết lấy dữ liệu đã bị thay đổi hay không. Cuối cùng, thời gian trả lời tại máy khách cũng khác nhau, nếu máy chủ đẩy dữ liệu thay đổi về máy khách thì thời gian đáp ứng tại phía máy khách gần như bằng 0, nếu dữ liệu trên máy khách không còn hiệu lực thì thời gian đáp ứng sẽ giống như cách tiếp cận kéo, đó là thời gian lấy dữ liệu từ máy chủ về máy khách.

Việc cân bằng hai cách tiếp cận này dẫn đến một dạng lai ghép lan truyền cập nhật dựa trên khái niệm thời gian quá hạn cho nội dung, máy chủ sẽ đẩy cập nhật đến các máy khách sau một thời gian nhất định, khi quá thời gian đó thì máy khách sẽ buộc phải hỏi máy chủ về cập nhật và nếu có dữ liệu thay đổi thì kéo về hoặc máy khách sẽ gia hạn thêm thời gian đẩy cập nhật. Việc tính toán thời gian quá hạn dựa trên các tiêu chí khác nhau, ví dụ có thể dựa trên thời gian cập nhật cuối cùng, nếu một mục dữ liệu nào đó không thay đổi trong một khoảng thời gian dài thì có thể tăng thời gian quá hạn, như vậy sẽ giảm đáng kể các thông điệp cập nhật. Cũng có thể dựa vào số lượng yêu cầu của máy khách để quyết định thời gian quá hạn hoặc thậm chí quyết định có lưu trạng thái của máy khách hay không, tần suất yêu cầu càng nhiều chứng tỏ máy khách càng cần phải được đảm bảo tính nhất quán. Những máy khách đã được máy chủ lưu trạng thái nếu càng gửi nhiều yêu cầu thì càng tăng thời gian quá hạn, yêu cầu cập nhật vẫn sẽ được chuyển đến các máy khách này khi có sự thay đổi nội dung mặc dù chưa hết thời gian quá hạn. Tiêu chí cuối cùng là không gian trạng thái tại máy chủ, khi máy chủ quá tải thì phải hạ thấp thời gian quá hạn để máy chủ giảm số lượng máy khách cần phải lưu trạng thái, thậm chí máy chủ có thể chuyển sang dạng không trạng thái, nghĩa là sẽ không lưu trạng thái của bất kỳ máy khách nào.

8.4.3.3     Phương pháp lan truyền cập nhật

Liên quan tới việc đẩy hay kéo cập nhật thì phải quyết định sử dụng phương pháp truyền thông điểm-điểm hay truyền theo nhóm, nếu sử dụng phương pháp thứ nhất thì máy chủ kho dữ liệu sẽ phải gửi thông điệp cập nhật riêng rẽ cho từng bản sao, nếu sử dụng phương pháp thứ hai thì các thông điệp sẽ dựa trên mạng và thông điệp sẽ được gửi đến các bản sao một cách hiệu quả, đa số các trường hợp sử dụng các phương tiện truyền theo nhóm sẵn có, nếu các bản sao nằm trong mạng cục bộ thì sự khác biệt giữa các phương pháp truyền không đáng kể. Phương pháp truyền theo nhóm thường có hiệu quả khi sử dụng kèm với cách tiếp cận đẩy để lan truyền cập nhật, nếu tích hợp cẩn thận thì chỉ cần sử dụng một nhóm. Ngược lại, cách tiếp cận kéo thông thường do một máy khách hoặc máy chủ yêu cầu bản sao được cập nhật, trong trường hợp này giải pháp truyền điểm điểm sẽ hiệu quả nhất.

8.5       Các giao thức nhất quán

Các mô hình nhất quán và những vấn đề thiết kế giao thức nhất quán đã được giới thiệu trong những phần trên, phần này sẽ tập trung cho việc cài đặt thực tế các mô hình nhất quán bằng cách triển khai một số giao thức nhất quán. Giao thức nhất quán mô tả cách cài đặt mô hình nhất quán riêng, trước hết sẽ xem xét dưới khía canh mô hình nhất quán lấy dữ liệu làm trung tâm sau đó sẽ đề cập tới các giao thức cho mô hình lấy máy khách làm trung tâm.

8.5.1       Nhất quán liên tục

Các giao thức nhất quán liên tục dựa trên các giải pháp của mô hình nhất quán liên tục, Yu và Vahdat trong các công trình nghiên cứu về tính nhất quán liên tục đã phát triển một số giao thức để giải quyết ba tiêu chí nhất quán, đó là những tiêu chí về sai số giữa các bản sao,  chênh lệch trạng thái và thứ tự các thao tác cập nhật.

8.5.1.1     Giới hạn sai số

Giả sử cần cập nhật mục dữ liệu x, mỗi thao tác cập nhật W(x) được gán trọng số weight(W), để đơn giản giả thiết weight(W)>0. Mỗi thao tác ghi ban đầu được chuyển đến một trong số N máy chủ bản sao và máy chủ này trở thành gốc của thao tác ghi, ký hiệu origin(W). Nếu xét hệ thống tại một thời điểm sẽ thấy một số cập nhật cần phải được lan tỏa đến tất cả các máy chủ. Mỗi máy chủ Si sẽ lưu vết nhật ký Li của các thao tác cập nhật được thực hiện trên bản sao cục bộ của mục dữ liệu x. Giả sử TW[i,j] là các thao tác cập nhật được thực hiện trên máy chủ Si với yêu cầu xuất phát từ máy chủ Sj:

TW[i,j] = ∑{weight(W) | origin(W) = Sj & W Є log(Si )}

Mục đích cần đạt là  với bất kỳ thời gian t nào thì giá trị Vi tại máy chủ Si xê dịch trong khoảng giá trị thực v(t) của mục dữ liệu x, giá trị thực này được quyết định bởi tất cả các thao tác cập nhật, nghĩa là nếu v(0) là giá trị ban đầu của mục dữ liệu x thì giá trị thực v(t) của mục dữ liệu x được tính theo công thức:

                       N

v(t) = v(0) + ∑  TW[k,k]

                    k=1

và giá trị Vi của bản sao i:

                      N

v(i) = v(0) + ∑  TW[i,k]           

                     k=1

Tập trung vào độ lệch tuyệt đối, kết hợp cận trên δi cho mỗi máy chủ Si, như vậy cần phải đảm bảo v(t) – vi ≤ δi. Các thao tác cập nhật gửi đến máy chủ Si sẽ phải lan truyền đến các máy chủ khác, có nhiều cách thực hiện nhưng thông thường sử dụng giao thức bệnh dịch  sẽ cho phép phổ biến các cập nhật nhanh nhất, ý tưởng cơ bản của thuật toán lan truyền như sau:

-         Giả thiết không xảy ra xung đột giữa các thao tác ghi-ghi.

-         Các thao tác cập nhật ban đầu được thực hiện chỉ trên một số bản sao.

-         Một bản sao chỉ gửi các cập nhật của nó tới tập hữu hạn hàng xóm.

-         Việc lan truyền các cập nhật xảy ra chậm chạp và không phải ngay lập tức.

-         Cuối cùng thì mỗi cập nhật cũng đến được từng bản sao.

Dựa trên thuật toán bệnh dịch mà có các mô hình lan truyền cập nhật, điều đáng lưu ý trong mô hình này là các cập nhật được lan truyền tới các bản sao với số lượng thông điệp càng ít càng tốt và càng nhiều bản sao bị nhận được các lan truyền càng nhanh càng tốt, cuối cùng nếu bản sao nào không lan truyền được cập nhật của mình thì nó sẽ bị loại bỏ. Một trong những mô hình lan truyền cập nhật gọi là anti entropy, mỗi bản sao cứ định kì lại chọn ngẫu nhiên một bản sao khác và trao đổi các trạng thái khác nhau của mình, sau một thời gian thì cả hai bên sẽ có những trạng thái giống hệt nhau. Một mô hình khác là gossiping, trong mô hình này mỗi bản sao thực hiện các thao tác cập nhật sẽ gửi cho các bản sao khác những cập nhật đó.

Trong mọi trường hợp khi máy chủ Si lan truyền cập nhật xuất phát từ máy chủ Sj đến máy chủ Sk thì máy chủ sau sẽ có thể học được giá trị TW[i,j] tại thời điểm gửi thao tác cập nhật, nói cách khác Sk có thể duy trì cách nhìn nhận TWk[i,j] mà nó tin cậy Sj, sẽ có giá trị TW[i,j], rõ ràng  0 TWk[i,j] TW[i,j]  TW[j,j]. Khi máy chủ Sk nhận thấy máy chủ Sj không giữ được nhịp độ cập nhật đã chuyển đến Sk, nghĩa là TWk[i,k] khác xa TW[k,k], đặc biệt nếu TW[k,k]-TWk[i,k] > δj/(N-1), máy chủ Sk sẽ chuyển tiếp các thao tác cập nhật đã lưu trong nhật ký của nó đến Sj. Việc chuyển tiếp này sẽ cải thiện đáng để cách nhìn TWk[i,k] mà Sk đã có của TW[i,k], làm cho độ lệch TW[i,k] - TWk[i,k] nhỏ hơn. Đặc biệt, Sk cải thiện cách nhìn của nó trên TW[i,k] khi ứng dụng đệ trình thao tác cập nhật mới làm tăng TW[k,k]-TWk[i,k]  vượt quá δj/(N-1), việc cải thiện luôn đảm bảo v(t) – vi ≤ δi.

8.5.1.2     Giới hạn chênh lệch trạng thái

Có nhiều cách để giữ trạng thái của các bản sao trong giới hạn xác định, một trong những cách đơn giản là cho phép máy chủ Sk giữ đồng hồ vector theo thời gian thực RVCk trong đó RVCk[i] = T(i). nghĩa là máy chủ Sk đã nhìn thấy tất cả các thao tác cập nhật đã gửi cho nó đến thời điểm T(i), với giả thiết các thao tác cập nhật được gán nhãn thời gian và T(i) là nhãn thời gian cục bộ của máy chủ Si. Khi máy chủ Sk nhận thấy T(i)-RVCk[i] vượt quá giới hạn xác định thì nó chỉ cần kéo các thao tác cập nhật xuẩt phát từ Si với nhãn thời gian lớn hơn RVCk[i]. Trong trường hợp này máy chủ bản sao có trách nhiệm giữ cho mục dữ liệu được cập nhật mới nhất bất chấp các thao tác cập nhật xuất phát từ đâu, ngược lại với giải pháp giới hạn sai số cho phép máy chủ gốc giữ các bản sao luôn được cập nhật mới nhất bằng cách chuyển tiếp các thao tác cập nhật. Trường hợp giới hạn chênh lệch trạng thái, thao tác đẩy cập nhật không đảm bảo tính nhất quán vì không biết trước thời gian lan truyền cập nhật tối đa sẽ là bao nhiêu, vì vậy thao tác kéo cập nhật sẽ cải thiện tình huống này do nhiều máy chủ cùng giúp giữ cho bản sao mục dữ liệu được cập nhật mới nhất.

8.5.1.3     Giới hạn độ  lệch thứ tự

Nguyên nhân độ lệch thứ tự trong nhất quán liên tục là do máy chủ bản sao đang tạm thời thực hiện những thao tác cập nhật đã gửi cho nó, nghĩa là các thao tác này chưa được khẳng định, chúng đang ở trong hàng đợi cục bộ và thứ tự thực sự của chúng đang phải chờ để được quyết định, độ lệch thứ tự được giới hạn bằng cách xác định chiều dài tối đa của hàng đợi các thao tác cập nhật chưa được khẳng định. Như vậy việc phát hiện vi phạm nhất quán thứ tự xảy ra khi chiều dài hàng đợi này vượt quá chiều dài tối đa đã xác định trước, tại thời điểm đó máy chủ sẽ không tiếp nhận thêm các thao tác cập nhật mới gửi đến, máy chủ sẽ cố gắng thực hiện khẳng định bằng cách đàm phán với các máy chủ khác về thứ tự của các thao tác đang chờ khẳng định. Nói cách khác, cần phải bắt buộc các máy chủ nhất quán toàn cục thứ tự các thao tác đang chờ khẳng định, điều này trong thực tế  thực hiện bằng các giao thức dựa trên bản chính hoặc giao thức dựa trên việc biểu quyết.

8.5.2       Các giao thức dựa trên bản chính

Trong thực tế, tính nhất quán trong các ứng dụng phân tán nói chung được xây dựng theo mô hình giới hạn độ lệch trạng thái hoặc độ lệch sai số bởi vì đó là những mô hình tương đối dễ hiểu. Khi nói đến các mô hình xử lý nhất quán theo thứ tự của các thao tác thì thông thường chúng được  gộp thành nhóm thông qua khóa hoặc giao tác. Nếu mô hình nhất quán hơi khó hiểu, dù cho mô hình đó có cải thiện hiệu năng thì những người phát triển phần mềm cũng không muốn áp dụng. Điểm mấu chốt nằm ở chỗ nếu ngữ nghĩa của mô hình nhất quán không trực quan rõ ràng thì cũng sẽ tốn nhiều thời gian để xây dựng các ứng dụng chính xác, tính đơn giản cần phải được đề cao.

Trường hợp nhất quán tuần tự cho thấy giao thức dựa trên bản chính chiếm ưu thế, mỗi mục dữ liệu được gắn với một bản chính và bản chính đó có trách nhiệm điều phối thao tác ghi trên tất cả các bản sao của mục dữ liệu. Nhân bản dựa trên bản chính thuộc về nhóm nhất quán tuần tự, một bản sao dữ liệu được chỉ định đóng vai trò chủ đạo cập nhật dữ liệu, gọi là bản chính để phân biệt với các bản sao khác. Cần phân biệt trường hợp bản chính cố định trên một máy chủ với trường hợp các thao tác cập nhật có thể được thực hiện trên máy chủ cục bộ sau khi chuyển mục dữ liệu từ bản chính về tiến trình phát sinh thao tác cập nhật, trường hợp thứ nhất gọi là giao thức ghi từ xa và trường hợp thứ hai gọi là giao thức ghi cục bộ.

8.5.2.1     Giao thức ghi từ xa

Giao thức dựa trên bản chính hỗ trợ nhân bản thực hiện theo nguyên lý tất cả các thao tác cập nhật đều được chuyển về một máy chủ cố định, các thao tác đọc sẽ được thực hiện cục bộ, những giao thức này còn gọi là các giao thức sao lưu chính. Hình 8.20 minh họa trường hợp cần phải cập nhật mục dữ liệu x, tiến trình sẽ chuyển thao tác cập nhật cho tiến trình trên máy chủ chính, sau khi hoàn thành cập nhật cục bộ, tiến trình trên máy chủ chính sẽ trả về kết quả cho tiến trình khởi đầu thao tác cập nhật và đồng thời lan tỏa cập nhật này tới các máy chủ của các bản sao khác, các bản sao sau khi hoàn thành cập nhật cục bộ cũng sẽ xác nhận với máy chủ chính.

 

Hình 8.20 Giao thức ghi từ xa

 

Giao thức này thường được kết hợp với các hệ thống khách/chủ truyền thống, nhược điểm cơ bản của nằm ở vấn đề hiệu năng, thao tác cập nhật có thể thực hiện tương đối lâu, tiến trình khởi sướng yêu cầu cập nhật sẽ bị phong tỏa trong thời gian đó, có thể khắc phục bằng cách sử dụng cơ chế không phong tỏa. Tuy nhiên nếu sử dụng cơ chế không phong tỏa sẽ phải giải quyết các vấn đề liên quan đến khả năng chịu lỗi, nếu hoạt động dựa trên cơ chế phong tỏa thì tiến trình máy khách sẽ tin chắc thao tác cập nhật đã được hoàn thành trên tất cả các bản sao. Giao thức dựa trên bản chính cung cấp khả năng cài đặt trực tiếp mô hình nhất quán tuần tự, máy chủ chính có thể sắp xếp tất cả các thao tác cập nhật theo thứ tự thời gian duy nhất trong toàn bộ hệ thống, kết quả là các tiến trình sẽ nhìn thấy các thao tác ghi theo cùng một thứ tự và sẽ không ảnh hưởng đến kết quả các thao tác đọc trên bất kỳ bản sao nào. Nếu sử dụng cơ chế phong tỏa thì các tiến trình luôn nhìn thấy kết quả của thao tác ghi gần nhất, điều này sẽ không được đảm bảo nếu sử dụng cơ chế không phong tỏa.

8.5.2.2     Giao thức ghi cục bộ

Giao thức dựa trên bản chính có thể thực hiện theo cách khác, bản sao chính di chuyển giữa các tiến trình để thực hiện thao tác ghi. Khi tiến trình muốn cập nhật mục dữ liệu, nó lấy bản chính của mục dữ liệu và chuyển về máy cục bộ để xử lý, sau khi hoàn thành trên máy cục bộ sẽ lan tỏa thao tác cập nhật đến tất cả các bản sao khác. Ưu điểm của cách tiếp cận này là nhiều thao tác cập nhật liên tiếp có thể thực hiện cục bộ trong khi các tiến trình khác vẫn có thể đọc bản sao cục bộ của nó, có thể cải thiện hiệu năng bằng phương thức không phong tỏa. Giao thức này phù hợp cho các thiết bị di động hay những nơi chất lượng mạng kém, chúng có thể vận hành ngay cả khi không có kết nối mạng.

Hình 8.21 Giao thức ghi cục bộ

 

Trước khi mất kết nối, thiết bị di động trở thành máy chủ chính cho các mục dữ liệu cần cập nhật, khi không được nối vào mạng các thao tác cập nhật sẽ được thực hiện cục bộ trong khi tiến trình trên các máy khác chỉ được phép thực hiện thao tác đọc, sau khi kết nối lại các thao tác cập nhật sẽ được lan truyền đến các bản sao để đưa kho dữ liệu về trạng thái nhất quán. Nên tổ chức theo cách chọn cố định một máy chủ trung tâm như trường hợp giao thức ghi từ xa, máy chủ tạm thời có thể cho phép một bản sao được phép thực hiện các thao tác cập nhật cục bộ, thực hiện xong thì chuyển về máy chủ trung tâm để lan tỏa đến các bản sao khác.

8.5.3    Các giao thức nhân bản cập nhật

Trong các giao thức này, thay cho việc cập nhật trên một bản sao sau đó mới lan tỏa đến các bản sao khác, thao tác cập nhật có thể được tiến hành đồng thời trên nhiều bản sao. Một tiến trình sẽ gán định danh cho mỗi thao tác cập nhật và chuyển đến các bản sao, có thể thực hiện bằng theo phường pháp nhân bản tích cực hoặc biểu quyết theo đa số.

8.5.3.1     Nhân bản tích cực

Trong nhân bản tích cực, mỗi bản sao kết hợp với tiến trình thực hiện các thao tác cập nhật, các thao tác cập nhật được gửi đến đến tất cả các bản sao và được thực hiện theo cùng một thứ tự, các thao tác đọc được thực hiện cục bộ trên mỗi bản sao. Ưu điểm của phương pháp này là tất cả các bản sao đều đồng thời nhận được các thao tác cùng thứ tự và cũng không cần đánh dấu một bản chính hay phải gửi tất cả các thao tác tới một máy chủ. Tuy nhiên giao thức này lại đòi hỏi phải truyền theo kiểu nhóm động hoặc phải có một bộ sắp xếp dãy tập trung mà cả hai phương pháp này đều khó có thể tiếp cận một cách linh hoạt.

Như vậy cần thiết phải sử dụng cơ chế truyền theo nhóm có thứ tự, điều này có thể thực hiện bằng cách gán nhãn thời gian logic, tuy nhiên cơ chế này không phù hợp với những hệ thống qui mô lớn, do đó có thể thay thế bằng cách sử dụng tiến trình điều phối và đồng thời đóng vai trò như một thành phần sản sinh số tuần tự. Các thao tác cập nhật sẽ được gửi đến tiến trình điều phối, tại đây chúng được gán số tuần tự và sau đó chuyển cho các bản sao, các bản sao sẽ thực hiện thao tác theo số tuần tự đã cấp. Việc sử dụng tiến trình điều phối cũng không giải quyết được vấn đề quy mô, trong thực tế cần phải kết hợp việc truyền theo nhóm với gán nhãn thời gian logic.

8.5.3.2     Giao thức dựa trên đại diện

Cách tiếp cận khác sử dụng kết quả bỏ phiếu để hỗ trợ thực hiện nhân bản thao tác ghi, máy khách yêu cầu các máy chủ cấp quyền được cập nhập trước khi thao tác với mục dữ liệu, giao thức dựa trên đại diện thực hiện các thao tác ghi trên một tập nhỏ nhất các bản sao. Ví dụ để được quyền cập nhật mục dữ liệu, máy khách phải nhận được sự chấp thuận của đa số các máy chủ bản sao, khi đã được cấp quyền thì tiến hành cập nhật và đồng thời đánh dấu phiên bản cho mục dữ liệu để thao tác đọc có thể nhận biết được phiên bản mới nhất. Trong giao thức này, tất cả các mục dữ liệu được kết hợp với một số phiên bản, mỗi lần một mục bị sửa đổi thì số phiên bản của nó cũng được tăng lên. Khi thực hiện một thao tác đọc, máy khách cũng phải liên hệ với các bản sao để tìm ra phiên bản mới nhất của dữ liệu.

Hình 8.22 Giao thức dựa trên đại biểu

 

Gifford đã tổng quát hóa cách tiếp cận dựa trên đại diện, giao thức này định nghĩa ra số đại biểu đọc và số đại biểu ghi, hai đại biểu này sẽ xác định số bản sao phải được liên hệ trước khi thực hiện thao tác đọc và ghi. Số đại biểu đọc phải lớn hơn ½ tổng số bản sao, vì thế tổng của số đại biểu đọc và ghi phải lớn hơn tổng số bản sao. Bằng cách này, máy khách muốn thực hiện một thao tác đọc thì phải đảm bảo việc liên hệ với ít nhất một bản sao có chứa phiên bản mới nhất của mục dữ liệu. Việc lựa chọn số lượng đại biểu dựa vào tỉ lệ giữa thao tác đọc và ghi cùng với chi phí khi thực hiện phương pháp giao tiếp giữa các nhóm. Giả sử hệ thống gồm N bản sao, ký hiệu Nr là tập các máy chủ bản sao tùy ý để đọc và Nw là tập các máy chủ bản sao chấp thuận thao tác cập nhật, khi đó phải thỏa mãn hai điều kiện:

1.      Nr + Nw > N

2.      Nw  > N/2

Điều kiện thứ nhất tránh xung đột đọc-ghi, điều kiện thứ hai tránh xung đột ghi-ghi, chỉ khi nào thỏa mãn các điều kiện này thì mới được phép đọc hoặc ghi. Ví dụ trên hình 8.22, trường hợp (a) Nr=3 và Nw = 10, như vậy phiên bản mới nhất xuất hiện trên 10 bản sao, sẽ có ít nhất một thành viên trong tập Nr cũng sẽ là thành viên của tập Nw máy khách sẽ tìm được phiên bản mới nhất và tìm ra máy chủ bản sao nào chứa phiên bản mới nhất. Trường hợp (b) có thể xảy ra xung đột ghi-ghi vì Nw= N/2, trường hợp (c) thể hiện đọc một và ghi tất cả, có thể đọc bất kỳ máy chủ nào cũng được bản sao mới nhất.

8.5.4    Giao thức gắn kết bộ nhớ cache

Bộ nhớ cache là trường hợp đặc biệt trong nhân bản, theo ngữ nghĩa, nói chung chúng chịu sự kiểm soát của máy khách chứ không phải máy chủ. Tuy nhiên, các giao thức gắn kết bộ nhớ cache đảm bảo chúng nhất quán với các bản sao khởi nguồn từ máy chủ, về nguyên lý các giao thức thức này không khác biệt nhiều so với các giao thức nhất quán. Đã có nhiều công trình nghiên cứu về việc thiết kế và cài đặt bộ nhớ cache, đặc biệt trong ngữ cảnh các hệ thống nhiều bộ xử lý chia sẻ bộ nhớ, nhiều giải pháp dựa vào sự hỗ trợ của phần cứng.  Trong ngữ cảnh các hệ thống phân tán dựa vào tầng trung gian xây dựng trên các hệ điều hành đa năng, các giải pháp dựa trên phần mềm có nhiều điểm thú vị hơn, trong trường hợp này hai tiêu chí riêng biệt thường được duy trì để phân loại các giao thức lưu trữ bộ nhớ cache. Thứ nhất, các giải pháp lưu giữ bộ nhớ cache có thể khác nhau trong chiến lược phát hiện tính gắn kết của chúng, nghĩa là phát hiện xác định khi nào thực sự phát hiện ra tính không nhất quán, có hai cách thực hiện như sau:

-         Phát hiện tĩnh: Chương trình biên dịch thực hiện các phân tích cần thiết trước khi thực hiện và quyết định những mục dữ liệu nào thực sự không nhất quán, như vậy phần mềm biên dịch chỉ cần thêm vào một số chỉ thị lệnh đảm bảo tính nhất quán.

-         Phát hiện động: Thường áp dụng trong các hệ thống phân tán, sự không nhất quán sẽ bị phát hiện trong thời gian chạy, ví dụ kiểm tra dữ liệu trên máy chủ để biết mục dữ liệu có bị thay đổi kể từ thời điểm thực hiện lưu giữ cache.

Trong cơ sở dữ liệu phân tán, các giao thức phát dựa trên phát hiện động có thể tiếp tục phân loại bằng cách xem xét chính xác khi nào phát hiện ra sự không nhất quán trong thời gian thực hiện giao tác, chúng gồm ba loại sau:

-         Khi đang thực hiện giao tác, máy khách truy nhập vào mục dữ liệu bộ nhớ cache và cần phải kiểm tra tính nhất quán với phiên bản đang lưu trên máy chủ, giao tác sẽ không thể tiếp tục sử dụng phiên bản đang lưu giữ cho đến khi hoàn thành việc kiểm tra tính nhất quán.

-         Giao tác tiếp tục thực hiện trong khi đang thực hiện kiểm tra, đây được coi là cách tiếp cận lạc quan, nó giả thiết dữ liệu trong cache đã được cập nhật mới nhất trước khi giao tác bắt đầu, nếu sau đó chứng minh được giả thiết trên là sai thì sẽ hủy bỏ giao tác.

-         Thực hiện kiểm tra dữ liệu đã lưu trong cache đã được cập nhật mới nhất trước khi thực hiện khẳng định giao tác, đây cũng được coi là cách tiếp cận lạc quan, giao tác bắt đầu bằng cách thao tác trên dữ liệu hiện hành của bộ nhớ cache với niềm tin đó là dữ liệu mới nhất, sau khi hoàn thành các bước chuẩn bị thì kiểm tra tính nhất quán của các mục dữ liệu đã sử dụng, nếu đó là dữ liệu cũ thì hủy bỏ giao tác.

Một vấn đề khác của giao thức gắn kết bộ nhớ cache là chiến lược ép buộc gắn kết, nó quyết định phương pháp duy trì tính nhất quán giữa bộ nhớ cache với dữ liệu lưu trên các máy chủ. Cách đơn giản nhất là cấm tất cả dữ liệu chia sẻ lưu giữ trên bộ nhớ cache, dữ liệu chia sẻ chỉ được lưu tại các máy chủ, tính nhất quán sẽ được đảm bảo bằng các giao thức dựa trên bản chính hoặc các giao thức nhân bản cập nhật, máy khách chỉ được phép lưu bộ nhớ cache cho những dữ liệu riêng, rõ ràng giải pháp này chỉ cải thiện một phần hiệu năng. Nếu dữ liệu chia sẻ được lưu trong bộ nhớ cache, có hai cách tiếp cận để ép buộc tính gắn kết, cách thứ nhất máy chủ gửi thông điệp hết hiệu lực đến tất cả các cache khi cập nhật mục dữ liệu, cách thứ hai đơn giản chỉ cần lan truyền cập nhật. Nhiều hệ thống cache sử dụng cả hai cách này, lựa chọn động giữa việc gửi thông báo hết hiệu lực hay lan truyền cập nhật đôi khi được sử dụng trong các cơ sở dữ liệu khách/chủ.

Cuối cùng, cần phải xem xét điều gì sẽ xảy ra khi tiến trình thay đổi dữ liệu cache, nếu sử dụng cache chỉ đọc thì các thao tác cập nhật chỉ cẩn thực hiện trên máy chủ sau đó sẽ sử dụng các giao thức phân phát để đảm bảo các cập nhật lan truyền đến cache. Trong nhiều trường hợp cách tiếp cận kéo cập nhật sẽ được sử dụng, máy khách phát hiện cache đã lỗi thời và gửi yêu cầu đến máy chủ để nhận được dữ liệu mới nhất. Một giải pháp khác thường được sử dụng trong các hệ thống tập tin phân tán, cho phép các máy khách trực tiếp thay đổi dữ liệu đã lưu giữ trong cache sau đó chuyển cập nhật đến máy chủ. Giải pháp này tương tự như giao thức cập nhật cục bộ dựa trên bản chính trong đó bộ nhớ cache của máy khách trở thành bản chính tạm thời. Để đảm bảo tính nhất quán, cần thiết phải cấp quyền cập nhật riêng cho máy khách, nếu không có thể xảy ra xung đột ghi-ghi. Thay đổi trực tiếp trên cache cải thiện đáng kể hiệu năng vì các thao tác được thực hiện cục bộ, có thể cải tiến hơn nữa bằng cách gộp một số thao tác cập nhật sau đó mới gửi đến máy chủ.

8.5.5    Cài đặt nhất quán lấy máy khách làm trung tâm

Nếu bỏ qua yếu tố hiệu năng thì việc cài đặt nhất quán lấy máy khách làm trung tương đối dễ hiểu, phần này sẽ giới thiệu một số cách cài đặt có tính chất thực tiễn.

8.5.5.1     Cài đặt đơn thuần

Trong cài đặt đơn thuần nhất quán lấy máy khách làm trung tâm, mỗi thao tác cập nhật W được gán một định danh toàn cục duy nhất do máy chủ đưa ra yêu cầu cập nhật qui định, trong nhất quán liên tục máy chủ này gọi là nguồn Origin(W). Máy chủ phải duy trì hai tập dữ liệu lưu vết thao tác đọc và thao tác ghi cho mỗi máy khách.  Đối với mô hình nhất quán đọc đều, khi máy khách thực hiện thao tác đọc trên máy chủ, máy chủ sẽ chuyển đến tập thao tác đọc để kiểm tra xem tất cả các định danh trên tập đọc đã được cập nhật cục bộ hay chưa, kích thước tập dữ liệu này có thể ảnh hưởng tới vấn đề hiệu năng. Nếu chưa được thực hiện, máy chủ có thể liên hệ với các máy chủ khác để cập nhật dữ liệu mới nhất trước khi thực hiện thao tác đọc hoặc chuyển tiếp yêu cầu cho máy chủ khác đã hoàn thành các thao tác cập nhật. Sau khi hoàn thành thao tác đọc, máy chủ sẽ thêm vào tập dữ liệu lưu vết thao tác đọc một bản ghi tương ứng với thao tác đọc mà máy khách đã yêu cầu.

Như vậy cần phải quyết định chính xác các thao tác ghi đã xác định trong tập thao tác đọc đã được thực hiện ở đâu, ví dụ định danh thao tác ghi có thể gồm định đanh của máy chủ đã đệ trình thao tác cập nhật. Máy chủ đó cần phải ghi nhật ký các thao tác cập nhật sao cho chó thể thực hiện lại trên máy chủ khác, hơn nữa các thao tác cập nhật cần được thực hiện theo thứ tự đã đệ trình. Việc sắp xếp thứ tự có thể thực hiện bằng cách để máy khách tạo ra số tuần tự duy nhất trong hệ thống và gắn vào định danh của thao tác cập nhật, nếu mỗi mục dữ liệu chỉ có thể thay đổi bởi chủ của nó thì sau này có thể cung cấp số tuần tự.

Mô hình nhất quán ghi đều cũng được cài đặt tương tự như mô hình nhất quán đọc đều, khi máy khách khởi sướng một thao tác cập nhật trên máy chủ thì máy chủ sẽ chuyển đến tập dữ liệu thao tác cập nhật để kiểm tra xem thao tác cập nhật đó đã từng được thực hiện hay chưa, kích thước của tập này có thể rất lớn ảnh hưởng đến các yêu cầu về hiệu năng, nếu đó là yêu cầu mới thì máy chủ sẽ thực hiện thao tác cập nhật thao đúng thứ tự. Sau khi hoàn thành thao tác cập nhật mới, định danh của thao tác sẽ được thêm vào tập thao tác ghi, việc duy trì tập dữ liệu các thao tác cập nhật sẽ làm tăng đáng kể thời gian trả lời cho máy khách vì máy khách sẽ chờ cho đến khi hoàn toàn thực hiện xong thao tác.

Nhất quán đọc kết quả ghi đòi hỏi máy chủ thực hiện thao tác đọc phải nhìn thấy tất cả các thao tác ghi trong tập thao tác ghi cho máy khách, các thao tác ghi có thể đơn giản lấy từ các máy chủ khác trước khi thực hiện thao tác đọc, mặc dù điều này có thể dẫn tới thời gian đáp ứng kém. Cách thực hiện khác, phần mềm trên máy khách có thể tìm kiếm máy chủ mà ở đó đã hoàn thành các thao tác trong tập thao tác cập nhật của máy khách. Nhất quán ghi theo sau đọc có thể được cài đặt bằng cách trước hết phải đảm bảo tất cả máy chủ đã hoàn thành các thao tác cập nhật có trong danh sách tập thao tác đọc, sau đó mới thêm định danh của thao tác vào tập dữ liệu các thao tác cập nhật.

8.5.5.2     Nâng cao hiệu năng

Dễ dàng nhận thấy tập thao tác đọc và ghi cho mỗi máy khách có thể sẽ rất lớn, để duy trì việc quản lý những tập này, các thao tác đọc và ghi của máy khách sẽ nhóm lại thành các phiên. Mỗi phiên thường kết hợp với một ứng dụng, mỗi phiên sẽ được mở khi ứng dụng bắt đầu và đóng lại khi thoát khỏi ứng dụng, mỗi phiên cũng có thể kết hợp với tạm thời kết thúc. Khi máy khách đóng phiên thì tập dữ liệu này cũng sẽ bị xóa, tất nhiên nếu máy khách không bao giờ đóng phiên thì tập dữ liệu này có thể vẫn sẽ rất lớn. Vấn đề chính của cài đặt đơn thuần nằm ở chỗ thể hiện tập các thao tác đọc và ghi, mỗi tập gồm một số định danh cho các thao tác ghi, bất cứ khi nào máy khách chuyển yêu cầu đọc hoặc ghi đến máy chủ, tập các cũng được chuyển cho máy chủ để biết các thao tác cập nhật tương ứng với yêu cầu đọc đã được máy chủ đó thực hiện hay chưa, thông tin này có thể được thể hiện hiệu quả hơn bằng cách sử dụng nhãn thời gian vector.

Khi máy chủ tiếp nhận một thao tác cập nhật mới W, nó gán cho thao tác đó một định danh và kèm theo nhãn thời gian ts(W), các thao tác cập nhật sau đệ trình lên máy chủ đó sẽ có giá trị cao hơn. Mỗi máy chủ Si duy trì nhãn thời gian WVCi trong đó WVCi[j] bằng với nhãn thời gian của thao tác cập nhật gần nhất xuất phát từ máy chủ Sj và đã được máy chủ Sj xử lý, giả thiết các thao tác cập nhật từ máy chủ Sj đều được xử lý theo thứ tự đã đệ trình. Khi máy khách gửi yêu cầu thực hiện thao tác đọc hoặc ghi tại một máy chủ, máy chủ sẽ trả về kết quả kèm theo nhãn thời gian của nó. Ví dụ cho mỗi phiên A sẽ xây dựng nhãn thời gian vector  SVCA với SVCA[i] được đặt giá trị bằng nhãn thời gian lớn nhất của tất cả các thao tác cập nhật trong A xuất phát từ máy chủ Sj:

SVCA[j] =max{ts(W)|W A & origin(W) =Sj}

Nói cách khác, nhãn thời gian của phiên luôn luôn thể hiện các thao tác cập nhật mới nhất, chúng được các ứng dụng đang thực hiện nhìn thấy như một phần của phiên. Tính cô đọng đạt được bằng cách thể hiện tất cả các thao tác cập nhật quan sát được xuất phát từ cùng máy chủ thông qua một nhãn thời gian.

Ví dụ máy khách là một phần của phiên A truy nhập vào máy chủ Si và chuyển SVCA cho Si, giả thiết SVCA[j] > SVCi[j], nghĩa là Si chưa nhìn thấy tất cả các thao tác cập nhật xuất phát từ Sj mà máy khách đã nhìn thấy. Tùy thuộc vào tính nhất quán được yêu cầu, máy chủ Si có thể lấy các thao tác cập nhật này trước khi thông báo nhất quán cho máy khách. Khi hoàn thành thao tác, máy chủ Si sẽ trả về nhãn thời gian của nó WVCi, ở thời điểm này SVCA được điều chỉnh SVCA[j] =max{SVCA[j],WVCi[j]}. Một lần nữa chúng ta lại thấy nhãn thời gian vector cung cấp cách đơn giản và nhỏ gọn thể hiện lịch sử sự kiện trong các tiến trình của hệ thống phân tán.

 


CHƯƠNG 9:                   BẢO MẬT

Bảo mật không phải là yếu tố quan trọng nhất nhưng có thể thấy đó là một trong những vấn đề phức tạp nhất vì nó bao trùm lên toàn bộ hệ thống, một lỗ hổng trong thiết kế bảo mật có thể làm cho tất cả các biện pháp bảo mật trở nên vô dụng. Xây dựng tất cả các loại cơ chế bảo mật áp dụng cho hệ thống sẽ không có ý nghĩa gì nếu không biết cách sử dụng để chống lại đối tượng nào, điều này đỏi hỏi phải biết về chính sách bảo mật phải được thực hiện. Chương này sẽ giới thiệu những vấn đề cơ bản về bảo mật, các chính sách bảo mật, vấn đề thiết kế cơ chế trợ giúp thực thi chính sách bảo mật, mã hóa dữ liệu và cuối cùng sẽ giới thiệu giải pháp  tích hợp vào hệ thống phân tán để hỗ trợ bảo mật.

Bảo mật trong hệ thống phân tán có thể chia thành hai nhóm, nhóm thứ nhất liên quan đến truyền thông giữa người sử dụng với người sử dụng hoặc giữa các tiến trình với nhau, nhóm thứ hai liên quan đến vấn đề lưu trữ trên các máy tính khác nhau. Nhóm thứ nhất liên quan tới các cơ chế căn bản để đảm bảo bí mật truyền thông là bí mật kênh truyền, trong khi nhóm thứ hai liên quan tới các vấn đề về ủy quyền và kiểm soát truy nhập. Bí mật kênh truyền và kiểm soát truy nhập đòi hỏi các cơ chế phân phát các khóa mã hóa và đồng thời cũng cần phải có những cơ chế về việc quản lý người sẻ dụng, những vấn đề này sẽ được đề cập tới trong mục quản lý bảo mật. Ngoài ra, cũng sẽ thảo luận các vấn đề giải quyết liên quan tới quản lý các khóa mã hóa, quản lý nhóm bảo mật và xử lý chứng chỉ bảo mật.

9.1       Giới thiệu chung

Bảo mật trong một hệ thống máy tính liên quan chặt chẽ đến khái niệm về tính chất tin cậy, có thể hiểu một hệ thống máy tính đáng tin cậy là hệ thống mà người sử dụng hoàn toàn tin tưởng vào các dịch vụ mà hệ thống đó cung cấp. Tính chất tin cậy bao gồm khả năng sẵn sàng, mức độ tin cậy, mức độ an toàn và khả năng bảo trì. Khả năng sẵn sàng liên quan tới công tác đảm bảo hệ thống hoạt động liên tục, đáp ứng ngay những yêu cầu sử dụng của người sử dụng, điều này cũng liên quan tới vấn đề dự phòng và khắc phục khi xảy ra sự cố.

Tuy nhiên, nếu chúng ta tin tưởng vào hệ thống máy tính thì cũng nên tính đến tính bí mật và toàn vẹn thông tin, tính bí mật ngụ ý thông tin chỉ được phép tiết lộ cho những đối tượng có thẩm quyền. Tính bí mật thể hiện sự bảo vệ dữ liệu của hệ thống thông tin, chỉ những người dùng hợp pháp mới được phép truy cập thông tin và thông tin đó được trao đổi theo các cơ chế đảm bảo an toàn, tránh truy nhập của người dùng bất hợp pháp. Tính toàn vẹn là đặc tính chỉ có thể thay đổi tài nguyên hệ thống theo cách đã được ủy quyền, đảm bảo dữ liệu không bị sửa đổi hoặc phá hủy bởi người dùng bất hợp pháp. Tài nguyên chính của hệ thống máy tính bao gồm phần cứng, phần mềm và dữ liệu, hệ thống phải có khả năng phát hiện và phục hồi cho những tài nguyên này khi những thay đổi không hợp lệ.

9.1.1    Các hình thức xâm phạm hệ thống thông tin

Một cách nhìn khác về bảo mật trong các hệ thống máy tính là chúng ta cố gắng bảo vệ các dịch vụ và dữ liệu chống lại các mối đe dọa về bảo mật. Hiểm họa đối với thông tin bao gồm những vấn đề liên quan tới điều kiện vật lý và các cuộc tấn công vào hệ thống. Hiểm họa vật lý có thể kể tới vấn đề nguồn điện, môi trường…, các cuộc tấn công từ bên ngoài có thể xuất hiện dưới dạng tấn công thăm dò, truy nhập trái phép, tấn công từ chối dịch vụ, tấn công bằng phần mềm chứa mã độc… Pfleeger  đã chỉ ra bốn loại hiểm họa bảo mật gồm chặn thông điệp, làm gián đoạn hệ thống, sửa đổi nội dung và bịa đặt nội dung.

Khái niệm chặn thông điệp đề cập đến tính huống đối tượng không có thẩm quyền đã giành được quyền truy nhập vào dịch vụ hoặc dữ liệu, ví dụ thông tin đã bị nghe trộm trên đường truyền. Hiểm họa gián đoạn cũng xảy ra khi dữ liệu bị sao chép trái phép, ví dụ sau khi đột nhập vào thư mục cá nhân sẽ làm hỏng hoặc xỏa các tập tin trong hệ thống, như vậy hệ thống sẽ không còn có khả năng cung cấp dịch vụ liên quan tới các tập tin đó. Tổng quát hơn, hiểm họa gián đoạn đề cập tới các tình huống dịch vụ hoặc dữ liệu không thể sẵn sàng, không thể sử dụng được hoặc bị phá hủy hoản toàn, các cuộc tấn công từ chối dịch vụ cố gắng làm cho người sử dụng không thể tiếp cận được với các dịch vụ cũng được xếp vào loại này.

Khái niệm sửa đổi bao gồm thay đổi trái phép dữ liệu hoặc giả mạo dịch vụ để nó không còn giữ được những đặc điểm kỹ thuật ban đầu, ví dụ chặn và sau đó thay đổi dữ liệu trên đường truyền, giả mạo các thực thể cơ sở dữ liệu và thay đổi chương trình để bí mật ghi lại các hoạt động của người sử dụng. Khái niệm bịa đặt đề cập đến tình huống tạo thêm dữ liệu hoặc hoạt động bình thường không tồn tại, ví dụ kẻ đột nhập có thể cố gắng thêm thông tin vào tập tin mật khẩu hoặc cơ sở dữ liệu, đột nhập vào hệ thống và gửi lại các thông điệp do hệ thống đã gửi trước đó. Lưu ý rằng các hình thức gián đoạn, sửa đổi và bịa đặt đều có thể được xem như những hình thức giả mạo dữ liệu.

Chỉ đơn giản nói rằng hệ thống nên có khả năng tự chống lại tất cả các hiểm họa bảo mật thì không phải là cách thực sự xây dựng một hệ thống an toàn, trước hết cần phải mô tả các yêu cầu bảo mật hay còn gọi là các chính sách bảo mật. Chính sách bảo mật mô tả chính xác các hành động nào các thực thể trong hệ thống được phép thực hiện và những hành động nào bị cấm. Các thực thể bao gồm người sử dụng, các dịnh vụ, dữ liệu, máy móc… Khi đã thiết lập chính sách bảo mật thì có thể tập trung vào những cơ chế bảo mật đẻ đảm bảo thực thi chính sách. Các cơ chế bảo mật quan trọng bao gồm mã hóa dữ liệu, xác thực, ủy quyền và lưu vết.

Mã hóa là nền tảng của bảo mật máy tính, nó chuyển dữ liệu thành dạng để kẻ tấn không không thể hiểu được, nghĩa là cung cấp các phương tiện để thực hiện bí mật dữ liệu. Hơn nữa, mã hóa còn cho phép chúng ta kiểm tra xem dữ liệu có bị sửa đổi hay không, như vậy nó cũng có thể hỗ trợ kiểm tra tính toàn vẹn. Xác thực dùng để kiểm tra tính chính danh của đối tượng tham gia, đối tượng có thể là người sử dụng hoặc máy tính và các thực thể khác, như vậy việc xác thực sẽ loại bỏ được những đối tượng giả mạo. Thông thường, người sử dụng được xác thực bằng mật khẩu, các thiết bị có thể được xác thực bằng địa chỉ logic hoặc địa chỉ vật lý và cũng có thể được xác thực bằng mật khẩu.

Sau khi đã xác thực, cần thiết phải kiểm tra xem đối tượng có được ủy quyền thực hiện các hành động đã yêu cầu hay không, thực chất đó là những qui định về phân quyền thực hiện. Các công cụ lưu vết ghi lại những đối tượng nào đã truy nhập và truy nhập bằng cách nào, mặc dù nó không bảo vệ chống lại các hiểm họa bảo mật nhưng nhật ký lưu vết có thể đặc biệt hữu ích cho việc phân tích lỗ hổng bảo mật và tìm ra các biện pháp chống lại kẻ tấn công. Vì lý do này kẻ tấn công mói chung rất ranh ma không để lại dấu vết nào để có thể dẫn đến lộ danh tính của mình, trong trường hợp này ghi nhật ký truy nhập đôi khi sẽ làm cho cuộc tấn công mạo hiểm hơn. Các điểm yếu của hệ thống phân tán nằm ở kỹ thuật truyền thông và chính sách bảo mật thông tin. Điểm yếu về kỹ thuật truyền tin trên mạng có nguyên nhân từ đặc tính mở của các  giao thức như HTTP, FTP, ICMP, SMNP, SMTP…. Điểm yếu về chính sách bảo mật hệ thống thông tin thể hiện ở việc không xây dựng chính sách khắc phục khi tấn công xảy ra và cũng không có qui trình giám sát và kiểm tra các hoạt động trong hệ thống thông tin.

9.1.1.1     Tấn công thăm dò

Kẻ truy nhập trái phép sử dụng hình thức tấn công này để khám phá hệ thống thông tin, ví dụ thông tin về hình trạng mạng, hệ điều hành, các dịch vụ sử dụng và các điểm yếu có thể lợi dụng để tấn công nhằm mục đích cuối cùng là lấy cắp dữ liệu, bắt đầu cho một cuộc tấn công nguy hiểm hoặc tấn công từ chối dịch vụ. Tấn công thăm dò thường được thực hiện theo các bước sau:

1.      Ping đến địa chỉ đích xem địa chỉ IP đó có hoạt động không.

2.      Quét cổng để xác định cổng hay dịch vụ nào đang hoạt động trên địa chỉ IP đó.

3.      Truy vấn đến các cổng, từ đó có thể xác định kiểu và phiên bản của ứng dụng, hệ điều hành.

4.      Từ các bước trên suy ra các điểm yếu có thể lợi dụng để tấn công.

9.1.1.2     Truy nhập trái phép

Để truy nhập được vào hệ thống thông tin phải có tài khoản đang nhập, việc lộ bí mật tài khoản dưới  bất cứ hình thức nào cũng có thể gây nên tổn hại làm mất mát thông tin. Đối tượng truy nhập trái phép trước hết phải đánh cắp thông tin tài khoản, công việc này có thể được thực hiện bằng các hình thức sau:

1.      Thăm dò mật khẩu: nhằm mục đích lấy cắp thông tin đăng nhập của người dùng bao gồm tên đăng nhập và mật khẩu, có thể sử dụng phương pháp dự đoán mật khẩu theo ký tự từ điển, đoán mật khẩu

2.      Đóng vai trung gian: Sử dụng các công cụ và phần mềm bắt gói tin, phân tích sửa đổi và là người trung gian chuyển dữ liệu cho máy trạm và máy chủ. 

3.      Sử dụng tính năng tin cậy có sẵn trong một số hệ thống truyền tin: Một số thiết bị và máy tính có cài đặt sẵn tính năng này nhằm nâng cao hiệu suất hoạt động.

9.1.1.3     Tấn công từ chối dịch vụ

Kẻ tấn công vô hiệu hóa hoặc phá hỏng hệ thống thông tin, làm chậm hệ thống và các dịch vụ ứng dụng với mục đích từ chối yêu cầu sử dụng dịch vụ cho những người dùng hợp pháp. Hình thức tấn công này dựa trên nguyên lý hoạt động của giao thức TCP phải thiết lập liên kết trước khi truyền số liệu, như vậy máy chủ sẽ luôn phải tiếp nhận các yêu cầu liên kết từ địa chỉ của kẻ tấn công.

9.1.1.4     Phần mềm độc hại

Phần mềm độc hại (Worms, Virus, Trojan Horses) là các chương trình chứa mã độc được chèn vào máy tính để phá hủy hệ thống, tự nhân bản và phát tán, từ chối dịch vụ hoặc truy cập tới mạng, hệ thống và các dịch vụ. Virus xâm nhập vào máy tính theo khi sao chép tập tin từ ổ đĩa trên máy tính, thông qua thư điện tử.... Các dấu hiệu khi hệ thống bị nhiễm virus:

-         Chương trình khởi động chậm hơn, điều này là do virus đang phát tán tới các tập tin khác trên hệ thống hoặc đang chiếm tài nguyên.

-         Xuất hiện các tập tin lạ trên ổ cứng hoặc mất tập tin, một số virus xóa các tập tin quan trọng của hệ thống.

-         Kích thước chương trình thay đổi so với phiên bản cài đặt ban đầu, điều này xảy ra vì virus gắn chính nó vào chương trình.

-         Trình duyệt, chương trình xử lý văn bản, màn hình, thực đơn và cách ứng dụng khác bị thay đổi.

-         Hệ thống bị tắt hoặc khởi động một cách bất thường.

-         Mất quyền truy cập đến ổ cứng hoặc các tài nguyên hệ thống khác, virus có thể thay đổi các thiết lập trên thiết bị làm cho nó không hoạt động chính xác.

-         Hệ thống không khởi động hoặc đưa ra các thông báo lỗi trong suốt quá trình khởi động.

Trojan horse không tự nhân bản, khi xâm nhập vào máy tính chúng thường tạo ra một lỗ hổng bảo mật gọi là cửa sau, kẻ đột nhập có thể thông qua cửa sau để xâm nhập và nắm quyền kiểm soát máy tính. Worm là một dạng mã độc có khả năng tự nhân bản, lây lan và không cần vật chủ, chúng có kích thước lớn hơn virus và thường núp dưới dạng một tập tin đính kèm thư điện tử. Worms không phải là virus nhưng hay được sử dụng như một công cụ để chứa và phát tán virus, khi máy tính bị nhiễm Worms nó sẽ nhanh chóng chiếm bộ nhớ và tự nhân bản.

9.1.2    Các vấn đề thiết kế

Hệ thống phân tán phải cung cấp các dịch vụ bảo mật để có thể cài đặt các chính sách bảo mật, nhiều vấn đề thiết kế quan trọng cần phải lưu ý khi cài đặt các dịch vụ bảo mật đa năng. Phần này sẽ giới thiệu những vấn đề cơ bản trong thiết kế bảo mật, đó là xác định trọng tâm kiểm soát, phân tầng cơ chế bảo mật, phân bố cơ chế bảo mật và tính đơn giản của cơ chế bảo mật.

9.1.2.1     Xác định trọng tâm bảo mật

Khi xem xét bảo vệ hệ thống phân tán, về cơ bản có ba cách tiếp cận khác nhau: bảo vệ dữ liệu, phân quyền thao tác và phân quyền cho người sử dụng. Cách tiếp cận thứ nhất tập trung vào việc bảo vệ trực tiếp dữ liệu, không quan tâm tới thao tác thực hiện mà mục đích chính là đảm bảo tính toàn vẹn dữ liệu. Ví dụ các ràng buộc trong các hệ quản trị cơ sở dữ liệu tự động kiểm tra sư thay đổi của mục dữ liệu, có thể đặt thuộc tính hoặc sử dụng đặc tính tự nhiên của giao tác để ngăn ngừa thay đổi cho những mục dữ liệu chỉ được phép đọc.

Cách tiếp cận thứ hai tập trung vào các thao tác, xác định đối tượng được phép gọi thao tác và thậm chí xác định thời gian được phép truy nhập tài nguyên, trọng tâm kiểm soát liên quan mạnh mẽ với các cơ chế kiểm soát truy nhập. Cách tiếp cận thứ ba tập trung trực tiếp vào người sử dụng bằng cách tạo ra các phương tiện và phân quyền cho họ để có thể truy nhập vào hệ thống. Như vậy vấn đề kiểm soát sẽ tập trung vào việc định nghĩa các vai trò của người sử dụng, hệ thống cần phải được thiết kế sao cho có thể định nghĩa các quyền, cung cấp cơ chế hỗ trợ kiểm soát truy nhập dựa trên việc phân quyền.

 


 

                                                       

(a) Bảo vệ chống các thao tác sai

(b) Bảo vệ chống thao tác chưa được cấp quyền

(c) Bảo vệ chống lại truy nhập chưa được ủy quyền

 

Hình 9.1 Các cách tiếp cận bảo mật

 

9.1.2.2     Phân tầng cơ chế bảo mật

Một điểm quan trọng trong thiết kế các hệ thống an toàn là quyết định các cơ chế bảo mật nên đặt ở tầng nào, khái niệm tầng ở đây được mạnh dạn sử dụng vì tất cả các hệ thống phân tán đều được xây dựng trên nền tảng mạng máy tính và các mạng máy tính đều được tổ chức phân tầng theo mô hình tham chiếu.

Hình 9.2 Tổ chức phân tầng logic hệ thống phân tán

 

Hình 9.2 thể hiện mô hình phân tầng của hệ thống phân tán, thông thường gồm tầng ứng dụng, tầng phần mềm trung gian, tầng dịch vụ hệ điều hành và tầng lõi của hệ điều hành. Việc tách biệt các dịch vụ đa dụng với các dịch vụ truyền thông để hiểu về cơ chế phân tầng bảo mật trong các hệ thống phân tán. Bảo mật là câu chuyện của kỹ thuật còn tin tưởng lại là cảm xúc, cơ chế bảo mật sẽ được đặt ở tầng nào phụ thuộc vào việc các dịch vụ sẽ được bảo mật như thế nào trong các tầng cụ thể để máy khách có thể tin tưởng. Ví dụ, xem xét tổ chức được đặt tại các địa điểm khác nhau và chúng được nối với nhau qua dịch vụ chuyển mạch tốc độ cao SMDS, mạng SMDS có thể coi như xương sống nối các mạng cục bộ  phân tán về mặt địa lý. Có thể thực hiện bảo mật bằng cách đặt thiết bị mã hóa tại mỗi thiết bị định tuyến của SMDS, những thiết bị này tự động mã hóa và giải mã các gói tin được gửi giữa các đia điểm nhưng không bảo vệ truyền thông giữa các máy cùng địa điểm. Người sử dụng thuộc các địa điểm khác nhau gửi thông điệp cho nhau, họ đều lo sợ thông điệp sẽ bị lộ khi gửi trên đường truyền, nhưng ít nhất họ phải tin tưởng rằng thông điệp đều sẽ được mã hóa khi ra khỏi mạng cục bộ, như vậy hệ thống phân tán đã cung cấp các biện pháp chống lại việc giả mạo thiết bị.

 

Hình 9.3 Bảo mật liên mạng

 

Giả sử người sử dụng không tin tưởng vào bảo mật liên mạng, họ có thể sử dụng các dịch vụ bảo mật của tầng vận tải như SSL (Secure Sockets Layer), các đoạn tin của tầng vận tải vẫn được mã hóa trên thiết bị mã hóa của mạng SMDS nhưng trong trường hợp này người sử dụng đặt niềm tin vào SSL. Trong các hệ thống phân tán, các cơ chế bảo mật thường đặt tại tầng phần mềm trung gian, nếu người sử dụng không tin tưởng SSL thì vẫn có thể sử dụng dịch vụ gọi thủ tục từ xa an toàn, người sử dụng một lần nữa lại tin tưởng vào dịch vụ gọi thủ tục từ xa an toàn như đã hứa hẹn, như thế sẽ không bị rò rỉ thông tin hoặc xác thực chính xác máy khách và máy chủ. Các dịch vụ bảo mật đặt ở tầng phần mềm trung gian của hệ thống phân tán chỉ có thể đáng tin cậy nếu chúng dựa trên các dịch vụ thực sự an toàn. Ví dụ, dịch vụ gọi thủ tục từ xa an toàn được cài đặt bằng SSL thì sự tin cậy của thủ tục gọi từ xa hoàn toàn phụ thuộc vào mức độ tin cậy SSL, nếu SSL không đáng tin cậy thì cũng không tin cậy dịch vụ gọi thủ tục từ xa.  

9.1.2.3     Phân bố cơ chế bảo mật

Sự phụ thuộc giữa các dịch vụ đối với sự tin cậy dẫn đến khái niệm cơ sở tính toán tin cậy, đó là tập tất cả các cơ chế bảo mật trong hệ thống phân tán cần thiết để đảm bảo chính sách bảo mật, như vậy nó phải được tin cậy, cơ sở tính toán tin cậy càng nhỏ càng tốt. Nếu hệ thống phân tán được xây dựng như phần mềm trung gian trên hệ điều hành thì tính bảo mật của nó có thể phụ thuộc vào tính bảo mật của các hệ điều hành cục bộ đang sử dụng, nghĩa là cơ sở tính toán tin cậy trong hệ thống phân tán có thể bao gồm cả các hệ điều hành cục bộ trên các máy khác nhau. Ví dụ các máy chủ tập tin trong hệ thống tập tin phân tán có thể phải dựa vào các cơ chế bảo vệ khác nhau do hệ điều hành cục bộ cung cấp, những cơ chế này không chỉ gồm việc bảo vệ các tập tin chống lại sự truy nhập của các tiến trình khác ngoài máy chủ tập tin mà còn các cơ chế bảo vệ máy chủ tập tin tránh được tấn công mạng.

Các hệ thống phân tán dựa trên phần mềm trung gian như vậy đòi hỏi tin tưởng vào các hệ điều hành cục bộ mà chúng phụ thuộc, nếu không tin tưởng thì một phần chức năng của hệ điều hành cục bộ có thể sẽ phải được tích hợp vào hệ thống phân tán. Hầu hết các dịch vụ của hệ điều hành đều chạy như những tiến trình của người sử dụng, trong trường hợp này hệ thống tập tin có thể phải thay thế hoàn toàn để đáp ứng các nhu cầu riêng của hệ thống phân tán, bao gồm cả các biện pháp bảo mật. Cách tiếp cận phù hợp sẽ là tách riêng các dịch vụ bảo mật với các loại dịch vụ khác bằng cách phân tán các dịch vụ trên các máy khác nhau tùy theo yêu cầu bảo mật. Ví dụ để bảo mật hệ thống tập tin phân tán có thể cách ly máy chủ tập tin với các máy khách bằng cách đặt máy chủ trên máy với hệ điều hành tin cậy, có thể chạy hệ thống tập tin an toàn chuyên dụng, các máy khách đặt trên các máy không tin cậy.

 

Hình 9.4 Nguyên lý RISSC áp dụng cho hệ thống phân tán

 

Việc tách riêng này làm giảm đáng kể cơ sở tính toán tin cậy xuống còn một lượng nhỏ các máy và các thành phần phần mềm, kết quả là bảo vệ các máy này tránh được những tấn công bảo mật từ bên ngoài, sự tin cậy tổng thể trong bảo mật hệ thống phân tán có thể sẽ tăng lên. Neumann  đã đưa ra cách tiếp cận RISSC (Reduced Interfaces for Secure System Components) để ngăn chặn các máy khách các ứng dụng  trực tiếp truy nhập vào các dịch vụ quan trọng, bất kỳ máy chủ bảo mật quan trọng nào đều được đặt trên máy riêng biệt cách ly với các hệ thống đầu cuối người sử dụng và sử dụng các giao diện mạng an toàn mức thấp, máy khách và các ứng dụng của họ có thể truy nhập đến máy chủ bảo mật thông qua các giao diện mạng này.

9.1.2.4     Tính đơn giản trong thiết kế bảo mật

Quyết định tầng nào sẽ đặt các cơ chế bảo mật phải đảm bảo tính đơn giản, nói chung việc thiết kế an toàn cho hệ thống máy tính là nhiệm vụ khó khăn, thiết kế sao cho cơ chế vận hành đơn giản và dễ hiểu nhưng vẫn phải đảm bảo tính tin cậy. Rất tiếc những cơ chế đơn giản không phải lúc nào cũng đủ để thực thi chính sách bảo mật, ví dụ về trường hợp kết nối liên mạng trên hình 9.3, mã hóa tầng liên kết là cơ chế đơn giản và dễ hiểu để bảo vệ chống lại nguy cơ đánh cắp khi trao đổi thông tin liên mạng, tuy nhiên người sử dụng lại muốn đảm bảo chính xác đối tượng gửi thông điệp cho mình. Trong trường hợp này cần đến các dịch vụ và xác thực mức người sử dụng, họ có thể muốn biết các dịch vụ đó làm việc như thế nào để đặt niềm tin vào những dịch vụ đó. Do đó, xác thực người dùng có thể yêu cầu ít nhất khái niệm về các khoá bí mật và hiểu biết về chứng chỉ, mặc dù nhiều dịch vụ bảo mật được tự động hóa ở mức cao và hoàn toàn trong suốt đối với người sử dụng.

Trong các trường hợp khác, bản thân ứng dụng vốn đã phức tạp và việc giới thiệu bảo mật chỉ làm cho vấn đề tồi tệ hơn. Ví dụ điển hình liên quan đến các giao thức bảo mật phức tạp là các hệ thống thanh khoản, sự phức tạp của giao thức thanh khoản thường do nhiều bên liên quan tham gia. Trong những trường hợp này, điều quan trọng là các cơ chế nền tảng được sử dụng để cài đặt các giao thức phải tương đối đơn giản và dễ hiểu. Tính đơn giản sẽ góp phần tạo ra sự tin cậy mà người sử dụng đầu cuối sẽ đưa vào ứng dụng và quan trọng hơn sẽ góp phần thuyết phục các nhà thiết kế rằng hệ thống không có lỗ hổng bảo mật.

9.1.3    Mã hóa

Nền tảng cho bảo mật trong các hệ thống phân tán là sử dụng các kỹ thuật mã hóa, đó là các giải pháp khác nhằm bảo vệ thông tin khi lưu chuyển trên mạng cũng như truy nhập vào kho dữ liệu. Tư tưởng cơ bản trong việc mã hóa thông tin là che giấu nội dung dữ liệu đối với những đối tượng không có thẩm quyền, vì vậy bên gửi sẽ mã hóa dữ liệu trước khi gửi, bên nhận sẽ giải mã dữ liệu nhận được để phục hồi lại  nội dung ban đầu. Tuy nhiên, việc mã hóa thông tin sẽ làm tăng công việc xử lý, điều đó làm ảnh hưởng đến hiệu suất hoạt động của hệ thống. Do đó, việc mã hóa thông tin cần phải thực hiện cho từng loại thông tin nhằm đảm bảo tính sẵn sàng phục vụ của hệ thống phân tán, cần phải biết cân đối hài hòa giữa mục tiêu bảo mật và khả năng đáp ứng yêu cầu dịch vụ của hệ thống.

Hình 9.5 Xâm nhập và nghe trộm trong truyền thông

 

Mã hóa và giải mã kết hợp với nhau bằng cách sử dụng các phương thức mã hóa khóa bí mật, dạng ban đầu của thông điệp gọi là bản rõ và dạng đã được mã hóa gọi là bản mã. Gọi bản tin rõ là P, khóa mã hóa là K, thông điệp được mã hóa theo khóa EK là C=EK(P), thông điệp được giải mã theo khóa giải mã P=DK(C). Hình 9.5 minh họa ba dạng tấn công trên đường truyền, kỹ thuật  mã hóa sẽ trợ giúp để chống lại những dạng tấn công này. Loại thứ nhất, kẻ đột nhập có thể chặn thông điệp mà bên gửi và bên nhận đều không biết đang bị nghe trộm, do bản tin đã được mã hóa nên khó có thể giải mã nếu không biết chính xác khóa bí mật, vì vậy việc chặn bản tin trở nên vô nghĩa, kẻ đột nhập không thể đọc được nội dung bản tin. Tuy nhiên cũng cần phải lưu ý, đôi khi chỉ cần một thông điệp kẻ tấn công cũng đủ để đưa ra nhận định nào đó, ví dụ lượng thông tin gửi đến một địa điểm đã qui định giảm đáng kể so với thông thường, trong khi lượng  tương ứng lại tăng lên đáng kể chuyển đến một địa điểm khác.

Loại tấn công thứ hai là sửa đổi thông điệp, sửa đổi thông điệp bản rõ rất dễ nhưng sửa thông điệp bản mã một cách chính xác sẽ phức tạp hơn rất nhiều, đầu tiên kẻ đột nhập phải giải mã được thông điệp trước khi thực hiện sửa đổi, sau đó lại phải mã hóa chính xác, nếu không bên nhận có thể được cảnh báo thông điệp đã bị giả mạo. Loại tấn công thứ ba, kẻ đột nhập thêm các bản tin mã hóa vào hệ thống truyền thông để bên nhận B tin rằng đó là thông điệp xuất phát từ bên gửi A, kẻ đột nhập đã thay đổi được nội dung thông điệp thì việc thêm một thông điệp giả mạo là chuyện bình thường, để thực hiện điều này tất nhiên kẻ tấn công phải biết được khóa bí mật trao đổi giữa bên gửi A và bên nhận B. Về cơ bản, dựa trên khóa mã hóa và khóa giải mã, có hai loại hệ thống mã hóa khác nhau, mã hóa đối xứng sử dụng khóa bí mật chung cho cả bên gửi lẫn bên nhận, trong mã hóa bất đối xứng khóa mã hóa bên gửi khác với khóa giải mã bên nhận.

Mã hóa đối xứng dùng khóa bí mật, khóa mã hóa và khóa giải mã giống nhau, bên nhận và bên gửi đều phải có khóa trên và khóa phải được giữ bí mật nên phương pháp này còn gọi là mã hóa bí mật hoặc mã hóa chia sẻ. Sử dụng ký pháp KA,B ngụ ý khóa K được chia sẻ giữa A và B, ta có:

P=DKA,B(EKA,B(P))

Mã hóa bất đối xứng dùng khóa công khai, khóa mã hóa và khóa giải mã khác nhau nhưng chúng tạo thành một cặp duy nhất giữa bên gửi và bên nhận, một khóa sẽ được giữ bí mật còn một khóa sẽ được công khai nên phương pháp này còn gọi là mã hóa công khai. Ký hiệu KE là khóa mã hóa và KD là khóa giải mã, ta có:

P=DKD(EKE(P))

Khóa nào được giữ bí mật sẽ tùy thuộc vào việc sử dụng khóa, ví dụ nếu A muốn gửi thông điệp bí mật cho B thì A sẽ sử dụng mã khóa công khai do B cung cấp, B nắm giữ khóa bí mật riêng nên chỉ có B mới có thể giải mã được thông điệp. Ngược lại nếu B muốn đảm bảo chắc chắn thông điệp đến từ A thì A phải sử dụng khóa bí mật riêng của mình để mã hóa thông điệp, B sử dụng khóa công khai của A để giải mã, nếu giải mã thành công thì chắc chắn thông điệp là của A.

Ứng dụng cuối cùng của mã hóa trong hệ thống phân tán là việc sử dụng các hàm băm, đầu vào của hàm băm là thông điệp m có độ dài tùy ý nhưng đầu ra là chuỗi các bit có độ dài cố định h=H(m). Hàm băm là hàm một chiều, việc tính toán hàm băm đơn giản nhưng không thể tìm thấy thông điệp m tương ứng với giá trị trả về của hàm băm. Nếu hai thông điệp khác nhau thì hàm băm sẽ trả về những giá trị khác nhau, ngược lại không thể tìm thấy hai thông điệp khác nhau mà có cùng giá trị trả về của hàm băm. Các đặc tính trên đã được áp dụng cho việc sản sinh cặp khóa bí mật và khóa công khai.

9.1.3.1     Giải thuật mã hóa DES

Giải thuật mã hóa DES (Data Encryption Standard) dùng cho các hệ thống mã hóa đối xứng, giải thuật thực hiện trên các khối dữ liệu 64 bit, mỗi khối được mã hóa qua 16 vòng lặp, mỗi vòng có một khóa mã hóa 48 bit riêng, 16 khóa này được sinh ra từ 56 bit khóa chính. Đầu vào của vòng lặp mã hóa thứ i là dữ liệu đã được mã hóa của vòng lặp thứ i-1, 64 bit dữ liệu qua mỗi vòng lặp được chia thành hai phần bằng nhau Li-1 và Ri-1, cùng bằng 32 bit. Phần dữ liệu bên phải Ri-1 được lấy làm phần bên trái của dữ liệu cho vòng sau: Ri-1= Li. Hàm f với đầu vào là Ri-1 và khóa Ki sinh ra khối 32 bit được XOR với  Li-1 để sinh ra Ri. Mỗi khóa 48 bit cho mỗi vòng lặp được sinh ra từ khóa chính 56 bit như sau: hoán vị khóa chính, chia đôi thành hai phần 28 bit. Tại mỗi vòng, mỗi một nửa đó sẽ quay trái một hoặc hai bit, sau đó lấy ra 24 bit kết hợp với 24 bit của nửa còn lại tạo ra khóa.

Hình 9.6 Vòng lặp sản sinh khóa trong DES

 

Nguyên lý của DES hoàn toàn đơn giản nhưng rất khó bẻ khóa nếu sử dụng các phương pháp phân tích, lý do vì sao vẫn chưa được giải thích công khai. Sử dụng tấn công thăm dò bằng cách tìm kiếm khóa sẽ làm cho công việc bẻ khóa trở nên dễ dàng hơn, vì vậy Triple DES cải tiến giải thuật bằng cách sử dụng DES ba lần với các khóa khác nhau sẽ làm tăng độ an toàn lên rất nhiều. Giải thuật DES đã được sử dụng làm kỹ thuật mã hóa chuẩn trong nhiều năm, tuy nhiên gần đây đang được thay thế bằng giải thuật Rijndael với khối 128 bit hoặc lớn hơn. Giải thuật Rijndael được thiết kế để chạy nhanh hơn và như vậy có thể được sử dụng trong các thẻ thông minh.

9.1.3.2     Giải thuật mã hóa RAS

Giải thuật RAS (viết tắt tên của ba nhà phát minh Rivest, Shamir và Adleman) được sử dụng rộng rãi trong các hệ thống khóa công khai, tính bảo mật của giao thức xuất phát từ thực tế chưa có phương pháp nào hiệu quả để tìm ra số nguyên tố rất lớn. Như chúng ta đã biết, mỗi số nguyên dương đều có thể viết dưới dạng tích của các số nguyên tố, trong RSA các khóa riêng và khóa công khai được tạo ra từ các số nguyên tố rất lớn với hàng trăm chữ số, việc bẻ khóa sẽ phải tốn rất nhiều thời gian. Cách sinh khóa của giả thuật RAS thực hiện theo bốn bước:

1.    Chọn 2 số nguyên tố lớn khác nhau p và q

2.    Tính n = p.q và z = (p-1).(q-1)

3.    Chọn một số tự nhiên d sao cho 1<d<z và nguyên tố cùng nhau với z

4.    Tính toán e sao cho e.d =1 mod z, nghĩa là tìm số tự nhiên x sao cho e=(x.z+1)/d cũng là số tự nhiên.

 Như vậy d và e tạo thành một cặp duy nhất, nếu dùng d để giải mã thì e sẽ dùng để mã hóa, có thể công khai một trong hai số này. Giải thuật RAS coi thông điệp được truyền đi là một dãy các số nhị phân, chia thông điệp m thành các khối có kích thước cố định mi sao cho 0 ≤ mi ≤ n. Ở bên gửi, mỗi khối mi sẽ tính giá trị ci = mie(mod n) rồi gửi đi. Bên nhận sẽ giải mã bằng cách tính mi = cid(mod n), như vậy để mã hóa cần biết e và n còn để giải mã thì cần biết d và n. So với giải thuật mã hóa đối xứng, giải thuật RSA tính toán phức tạp hơn do đó thời gian thực hiện sẽ gấp hàng trăm lần. Vì vậy giải thuật RSA chỉ nên áp dụng để trao đổi các khóa bí mật chứ không dùng cho việc mã hóa các dữ liệu thông thường.

9.1.3.3     Hàm băm MD5

Hàm băm MD5 (Message-Digest 5) được sử dụng rộng rãi trong các giải thuật mã hóa, nó tính toán xâu ký tự nhị phân bất kỳ để cho về giá trị băm 128 bit và thường thể hiện dưới dạng chữ số hệ hexa. Dữ liệu đầu vào trước hết được thêm vào sao cho số dư của chiều dài sau khi thêm là 448 bits, sau đó thêm 64 bit thể hiện chiều dài của dữ liệu ban đầu, như vậy toàn bộ dữ liệu sẽ được chia thành các đoạn 512 bit. Giải thuật MD5 bắt đầu bằng hằng số 128 bit và thực hiện trong k pha, trong đó k là số lượng khối 512 bit, trong mỗi pha chữ số 128 bit được tính từ khối 512 bit của dữ liệu đầu vào và 128 bit của pha trước.

 

Hình 9.7 Cấu trúc của MD5

 

 

Hình 9.8 Thao tác lặp trong vòng đầu của pha MD5

 

Mỗi pha trong MD5 gồm 4 vòng tính toán, mỗi vòng sử dụng một trong bốn hàm, mỗi hàm thao tác với các biến số 32 bit x, y và z:

F(x.y.z) = (x AND y) OR (NOT x) AND z)

G(r.y.z) = (x AND z) OR (y AND (NOT z)

H(x.y.z) =x XOR y XOR z

I (z.y.z) =y XOR (x OR (NOT z))

Ví dụ, khối b được chia thành 16 khối con dài 32 bit ký hiệu b0 đến b15, mỗi khối con sẽ ký hiệu là (p.q.r.s). Tại vòng thứ nhất, hàm f dùng để thay đổi bốn biến số  (p.q.r.s) trong 16 thao tác lặp như trên hình 9.8, có tổng cộng 64 hằng số định nghĩa trước Ci, ký hiệu x<<<n nghĩa là quay sang trái, các bit của biến x sẽ được dịch sang bên trái n vị trí, bit bên trái nhất sẽ chuyển về vị trí của bit bên phải nhất. Các biến này được thực hiện cho mỗi vòng tiếp theo và sau khi một pha kết thúc được chuyển sang pha kế tiếp. Vòng thứ hai sử dụng hàm G theo cách tương tự, hàm H sử dụng cho vòng thứ 3 và I sử sụng cho vòng thứ 4, cứ lặp lại như vậy cho đến khi hoàn thành. Như vậy mỗi vòng sẽ gồm 64 thao tác lặp lại sau đó lại bắt đầu pha mới với các giá trị (p.q.r.s) ở tại điểm này.

9.2       Các kênh bảo mật

Mô hình khách chủ thường được sử dụng để xây dựng hệ thống phân tán, máy chủ cũng có thể đóng vai trò máy khách đối với các máy chủ khác. Bảo mật cho hệ thống phân tán phải bảo đảm thông tin được an toàn trên các máy chủ và trên đường truyền mạng. Bảo mật dữ liệu trên mỗi máy chủ liên quan tới vấn đề kiểm soát quyền truy nhập, bảo mật truyền thông đòi hỏi xác thực các bên tham gia. Trong nhiều trường hợp bảo mật truyền thông yêu cầu tính toàn vẹn và bí mật dữ liệu, đặc biệt truyền thông nội bộ giữa các máy chủ. Vấn đề bảo mật truyền thông có thể thực hiện bằng cách thiết lập kênh bảo mật giữa các bên tham gia, nó sẽ bảo vệ chống lại các hiểm họa bảo mật. Chống lại hiểm họa chặn thông điệp bằng các phương tiện mã hóa, chống lại hiểm họa sửa đổi và bịa đặt bằng cách sử dụng các giao thức xác thực lẫn nhau, phần tiếp theo sẽ đề cập tới cách sử dụng các giao thức này.

9.2.1    Xác thực

Xác thực và đảm bảo toàn vẹn dữ liệu luôn phải đi kèm với nhau, một hệ thống đảm bảo tính xác thực nhưng không đảm bảo toàn vẹn thì cũng không có ý nghĩa trong bảo mật dữ liệu, thông điệp hoàn toàn có thể bị sửa đổi khi di chuyển trên đường truyền. Tương tự như vậy một hệ thống bảo đảm tính toàn vẹn nhưng không  bảo đảm tính xác thực thì cũng không có ý nghĩa, kẻ tấn công hoàn toàn có thể giả mạo bên gửi hoặc bên nhận. Trong nhiều giao thức hai công việc này được cài đặt bằng cách thực hiện xác thực khi thiết lập kênh liên kết các bên tham gia, sau đó bảo đảm tính toàn vẹn dữ liệu bằng cách sử dụng mã hóa khóa bí mật cho mỗi phiên giao dịch, khóa bí mật của mỗi phiên sẽ bị hủy bỏ khi kết thúc kênh liên kết.

9.2.1.1     Xác thực dựa trên khóa bí mật

Xác thực dựa trên khóa bí mật giả thiết tất cả các bên tham gia hai đều phải biết khóa bí mật, làm thế nào để trao đổi khóa này sẽ đề cập trong các phần sau. Giao thức được thực hiện theo cách thông thường, các bên tham gia sẽ không nghi ngờ nhau nếu các bên đều biết khóa bí mật. Hình 9.9 minh họa trao đổi thông tin giữa A và B để thực hiện xác thực dựa trên khóa bí mật, cả A và B đều phải biết khóa bí mật KA,B. Đầu tiên, A gửi cho B định danh của mình để yêu cầu thiết lập kênh truyền, B sẽ gửi lại A một số ngẫu nhiên RB, A sử dụng khóa bí mật KA,B để trả về cho B giá trị đã mã hóa EKA,B(RB). Nhận được giá trị từ A, B sẽ giải mã  DKA,B(EKA,B(RB)), nếu kết quả trùng khớp với RB thì B có thể tin cậy đối tượng đang thiết lập liên kết chính xác là A. Tuy nhiên A vẫn chưa biết đối tượng đang thiết lập liên kết có chính xác là B hay không, vì vậy A sẽ gửi tiếp một số ngẫu nhiên RA cho B, B trả về giá trị mã hóa EKA,B(RA), nhận được giá trị này A sẽ giải mã DKA,B(EKA,B(RA)), nếu kết quả trùng khớp với RA thì A có thể tin cậy đối tượng đang thiết lập liên kết chính xác là B. Qui trình thực hiện như trên đòi hỏi phải trao đổi năm thông điệp, phiên bản rút gọn thể gộp thông điệp thứ tư vào thông điệp thứ nhất và thông điệp thứ năm vào thông điệp thứ hai, như vậy sẽ chỉ còn trao đổi ba thông điệp và sẽ tiết kiệm thời gian xác thực giữa các bên tham gia

 

Hình 9.9 Xác thực dựa trên khóa bí mật thực hiện 5 bước

 

Hình 9.10 Xác thực dựa trên khóa bí mật thực hiện 3 bước

 

Rất tiếc giao thức rút gọn này rất dễ bị tấn công phản xạ, giả sử C muốn mạo danh A để xác thực với B mà không cần biết khóa bí mật KA,B. Quá trình giả mạo tiến hành bằng cách C thiết lập phiên làm việc thứ nhất để gửi cho B thông điệp chứa định danh của A và số ngấu nhiên RC, B sẽ trả về RB, EKA,B(RC), tuy nhiên C không biết khóa bí mật nên nó thiết lập một phiên khác và  gửi cho A thông điệp C, RB, A sẽ mã hóa EKA,B(RB) và gửi cho C, tất nhiên C sẽ lấy giá trị này và trở về phiên làm việc thứ nhất để gửi cho B, như vậy B tin rằng C chính là A. Nói chung cho phép các bên tham gia thiết lập kênh an toàn thực hiện một số công việc như nhau không phải là ý tưởng tốt.

 

Hình 9.11 Tấn công phản xạ

 

Trong ví dụ trên, B đã vi phạm qui tắc an toàn khi cung cấp thông tin hữu ích RB, EKA,B(RC) trong khi chưa biết C là ai, nhưng điều này lại không bi phạm qui tắc của giao thức rút gọn. Bài học ở đây là vấn đề thiết kế các giao thức bảo mật thực tế khó khăn hơn rất nhiều so với những hình dung ban đầu, việc tinh chỉnh giao thức để tăng hiệu năng có thể ảnh hưởng tới tính chính xác của giao thức như đã minh chứng trên.

9.2.1.2     Xác thực sử dụng trung tâm phân phối khóa

Xác thực dựa trên khóa bí mật sẽ không phù hợp cho hệ thống qui mô lớn, giả sử có N máy thì mỗi máy sẽ phải giữ N-1 khóa và cả hệ thống sẽ cần tới N(N-1)/2 khóa. Để khắc phục vấn đề này có thể sử dụng trung tâm phân phối khóa KDC (Key Distribution Center), trung tâm chia sẻ khóa bí mật với mỗi máy nhưng không có cặp máy nào phải có khóa bí mật, trung tâm chỉ cần giữ N khóa. Nếu A muốn thiết lập kênh an toàn với B thì A sẽ yêu cầu KDC trợ giúp bằng cách gửi khóa bí mật cho cả A và B.

Hình 9.12 Nguyên lý sử dụng trung tâm phân phối khóa

 

Đầu tiên A gửi thông điệp cho KDC đề đạt nguyện vọng muốn kết nối với B, KDC sẽ sinh khóa KA,B sau đó mã hóa EKA,KDC(KA,B) gửi cho A và EKB,KDC(KA,B) gửi cho B. Nhược điểm chính của giải pháp này là A có thể bắt đầu thiết lập kênh an toàn với B trong khi B chưa nhận được khóa bí mật từ KDC, điều này có thể khắc phục bằng cách KDC sẽ chuyển thẻ EKB,KDC(KA,B) cho A để A tự kết nối với B như minh họa trên hình 9.13, B vẫn là đối tượng duy nhất biết cách giải mã thẻ EKB,KDC(KA,B), các phiên bản của giải pháp này là các giao thức Needham-Schroeder và Kerberos.

 

Hình 9.13 KDC cho phép hai bên tự kết nối

 

Nếu sử dụng giao thức Needham-Schroeder, A sẽ gửi yêu cầu đến KDC chứa thẻ mời B bao gồm định danh của A và số ngẫu nhiên RA1. KDC sẽ trả lởi bằng cách trả về giá trị mã hóa EKA,KDC(RA1, B, KA,B, EKB,KDC(A, KA,B)), các giá trị RA1 và B trong tham số hàm mã hóa để A kiểm chứng với giá trị nó đã gửi cho KDC nhằm mục đích tránh tấn công phản xạ,  thẻ EKB,KDC(A, KA,B) để A có thể thiết lập liên kết với B.

 

 

Hình 9.14 Giao thức Needham-Schroeder

 

Sau khi nhận được kết quả từ KDC, A sẽ sinh số ngẫu nhiên RA2 và thực hiện mã hóa EKA,B(RA2), EKB,KDC(A, KA,B) để gửi cho B, nhận được bản tin này B sẽ giải mã DKB,KDC(EKB,KDC(A, KA,B)) và hiểu rằng A muốn thiết lập liên kết với khóa bí mật là KA,B , dựa vào khóa này sẽ giải mã DKA,B(EKA,B(RA2)) và biết được giá trị RA2. B sẽ sinh số ngẫu nhiên RB và gửi cho A giá trị EKA,B(RA2-1, RB), RA2-1 chứ không phải RA2 ngụ ý B đã biết khóa bí mật và sử dụng khóa đó giải mã thành công, nhận được bản tin A sẽ gửi cho B giá trị EKA,B(RB-1). Như vậy giao thức đã chống được tấn công phản xạ, tuy nhiên nếu kẻ tấn công C biết được khóa cũ KA,B thì sẽ gửi lại thông điệp thứ 3 để giả mạo A, trong trường hợp này cần phải tạo mối ràng buộc giữa thông điệp thứ ba với thông điệp đầu tiên, giải pháp được thể hiện trên hình 9.15. Bí quyết nằm ở chỗ trước khi kết nối với KDC, A sẽ gửi thông điệp yêu cầu kết nối với B, khi đó B sinh ra số ngẫu nhiên RB1 và trả về cho A giá trị mã hóa EKB,KDC(RB1), tất nhiên A sẽ không giải mã được giá trị này mà chỉ gửi kèm theo thông điệp gửi đến KDC. Nhận được yêu cầu từ A, KDC sẽ giải mã và biết được giá trị RB1 nên sẽ gửi cho A thông điệp trả về giá trị  EKA,KDC(RA1, B, KA,B, EKB,KDC(A, KA,B, RB1)), các bước tiếp theo tương tự như giao thức cơ bản đã trình bày trên.

Hình 9.15 Giao thức Needham-Schroeder chống lại tái sử dụng khóa phiên trước

 

9.2.1.3     Xác thực dựa trên mã hóa khóa công khai

Xác thực dựa trên mã hóa khóa công khai đòi hỏi mỗi bên cần phải biết khóa công khai của nhau, ký hiệu K+ là khóa công khai và K- là khóa riêng bí mật. A bắt đầu phiên bằng cách sinh số ngẫu nhiên RA và sử dụng khóa công khai K+ B  để mã hóa bản tin EK+B(A, RA) và gửi cho B, nhận được thông điệp này B sẽ sử dụng khóa riêng bí mật K- B để giải mã, nếu thành công sẽ sinh số ngẫu nhiên RB  và khóa phiên KA,B sau đó sử dụng khóa công khai K+ A  để mã hóa bản tin EK+A(RA, RB, KA,B) và gửi cho A.

 

Hình 9.16 Xác thực lẫn nhau dựa trên mã hóa khóa công khai

 

Nhận được bản tin A sẽ sử dụng khóa riêng K- A để giải mã, nếu thành công sẽ sử dụng khóa phiên KA,B để mã hóa bản tin EKA,B(RB). B nhận được bản tin sẽ sử dụng khóa bí mật của phiên để giải mã, nếu giá trị giải mã bằng RB thì B tin rằng đối tượng thiết lập kết nối chắc chắn là A.

9.2.2    Toàn vẹn và bí mật thông điệp

Bên cạnh việc xác thực, kênh an toàn còn phải đảm bảo tính toàn vẹn và bí mật cho thông điệp, tính toàn vẹn bảo vệ thông điệp chống lại những sửa đổi gian lận trong khi đó tính bí mật đảm bảo thông điệp không bị đọc trộm. Tính bí mật có thể thực hiện được bằng cách sử dụng khóa bí mật của các bên hoặc mã khóa công khai của bên nhận để mã hóa thông điệp trước khi gửi, tuy nhiên bảo vệ thông điệp không bị sửa đổi là vấn đề phức tạp hơn nhiều.

9.2.2.1     Chữ ký số

Xét một giao dịch thương mại điện tử, A gửi thông điệp cho B đồng ý mua hàng, có thể xảy ra hai tình huống gian lận: A phủ nhận thanh toán vì cho rằng đó là thông điệp giả mạo, B nâng tổng số tiền mà A đã mặc cả. Hai tình huống này có thể giải quyết nếu A sử dụng chữ ký số cho thông điệp đã gửi, sự kết hợp duy nhất giữa thông điệp và chữ ký số bảo vệ không bị sửa đổi, A cũng không thể phủ nhận nếu chứng minh được đó là chữ ký của A. Một trong những cách phổ biến là sử dụng mã hóa khóa công khai như RSA như minh họa trên hình 9.17, A sử dụng khóa riêng K-A để mã hóa gửi thông điệp gửi cho B, nếu muốn bí mật nội dung thì có thể sử dụng khóa công khai  K+B , như vậy thông điệp gửi lên kênh truyền sẽ là EK+B(m, EK-A(m)).

 

Hình 9.17 Chữ ký số sử dụng khóa mã hóa công khai

 

Nhận được thông điệp, B sẽ sử dụng khóa riêng của mình K-B để giải mã, như vậy sẽ nhận được bản rõ và bản mã của thông điệp. Bên gửi sẽ không thể nghi ngờ bên nhận đã sửa đổi thông điệp vì chỉ sử dụng khóa công khai K+A để giải mã EK-A(m), nếu kết quả giải mã trùng khớp với bản rõ m chứng tỏ bản tin đã không bị sửa đổi và đó là bản tin mà A đã ký trước khi gửi đi, bên gửi cũng không thể chối bỏ trách nhiệm của mình. Tuy nhiên, tính hợp lệ của chữ ký có thể duy trì khi khóa riêng của bên gửi không bị lộ, vì vậy bên A vẫn có thể chối bỏ với lý do khóa riêng đã bị đánh cắp trước khi gửi thông điệp.

 

Hình 9.18 Chữ ký số sử dụng bản thu gọn của thông điệp

 

Bên gửi hoàn toàn có quyền thay đổi khóa riêng của mình, đây là việc bình thường vì thường xuyên thay đổi khóa sẽ giúp chống lại xâm nhập trái phép. Khi bên A thay đổi khóa thì những thông điệp đã gửi cho B sẽ không có giá trị, trường hợp này đòi hỏi phải có một trung tâm quản lý lưu vết khóa để ghi nhận thời điểm thay đổi và sử dụng thêm nhãn thời gian cho chữ ký điện tử. Ngoài ra có thể thấy việc mã hóa toàn bộ thông điệp là công việc khá tốn kém về mặt kỹ thuật, một giải pháp khác đơn giản hơn là chỉ cần sử dụng chữ ký cho bản thu gọn của thông điệp. Bản thu gọn thông điệp là xâu bit có chiều dài cố định và được tính toán từ thông điệp có chiều dài bất kỳ bằng cách sử dụng hàm băm, như vậy thay cho việc mã hóa cho toàn bộ thông điệp m thì chỉ cần mã hóa cho xâu bit có chiều dài cố định H(m), hình 9.18 minh họa cho quá trình này. Bên B sẽ chỉ cần giải mã H(m) bằng khóa công khai của bên A sau đó so sánh với kết quả thực hiện hàm băm trên bản rõ nhận được, nếu trùng khớp thì có thể khẳng định đó là thông điệp do bên A đã ký trước khi gửi.

9.2.2.2     Khóa phiên

Trong truyền thông qua kênh an toàn, sau khi hoàn thành xác thực nói chung các bên sẽ sử dụng khóa phiên chia sẻ duy nhất để đảm bảo bí mật, khóa phiên sẽ bị loại bỏ một cách an toàn khi kênh không còn được sử dụng nữa. Tất nhiên hoàn toàn có thể sử dụng lại các khóa này, tuy nhiên việc sử dụng lại có thể dễ dàng bị lộ, kẻ tấn công có thể chặn những thông điệp sử dụng cùng một khóa và tìm ra những đặc tính của khóa. Vì vậy, sẽ an toàn hơn nhiều nếu sử dụng các khóa xác thực càng ít càng tốt, nên sử dụng các cơ chế băng ngoài và giữ ở mức tối thiểu việc trao đổi các khóa. Một lý do quan trọng khác, với việc sử dụng khóa phiên thì các bên tham gia có thể được bảo vệ trước những cuộc tấn công lặp lại, các thông điệp cần phải được gắn số tuần tự và nhãn thời gian.

Giả sử tính toàn vẹn và bảo mật thông điệp đã đạt được bằng cách sử dụng cùng một khoá khi thiết lập phiên, nếu bị lộ khóa thì kẻ đột nhập có thể giải mã các thông điệp đã trao đổi trong những phiên trước, như vậy sử dụng khóa phiên sẽ an toàn hơn rất nhiều, nếu bị lộ khóa thì kẻ tấn công chỉ có thể đọc được những thông điệp trong phiên đó. Ngoài ra, ngay cả những đối tượng nhận thông điệp cũng không đáng tin cậy, do đó chỉ cần khóa phiên là đủ để bảo đảm cho tính toàn vẹn và bảo mật thông điệp cho những đối tượng này, kết hợp sử dụng khóa lâu dài với khóa phiên để  triển khai các kênh an toàn cũng là giải pháp tốt cần được áp dụng.

9.2.3    Truyền thông nhóm bảo mật

Kênh truyền bảo mật không chỉ giới hạn cho hai thành viên tham gia, trong một số trường hợp có thể nhiều hơn hai thành viên, ví dụ trao đổi thông tin giữa các bản sao khi thực hiện nhân bản cũng phải đảm bảo các yêu cầu về bảo mật.

9.2.3.1     Bí mật truyền thông trong  nhóm

Tính bí mật truyền thông trong nhóm được thực hiện đơn giản bằng cách yêu cầu tất cả các thành viên sử dụng khóa bí mật của nhóm để mã hóa và giải mã các thông điệp lưu chuyển giữa các thành viên trong nhóm, tất nhiên mỗi thành viên sẽ phải nghiêm túc thực hiện giữ bí mật cho khóa này. Giải pháp thứ hai phức tạp hơn nhưng lại đảm bảo bí mật hơn, từng cặp thành viên sẽ sử dụng  một khóa bí mật, như vậy nếu nhóm có N thành viên sẽ cần phải có N(N - 1)/2 khóa. Giải pháp thứ ba dung hòa hai giải pháp trên bằng cách sử dụng hệ thống mã hóa khóa công khai, mỗi thành viên sở hữu cặp khóa công khai và khóa riêng, khóa công khai sẽ chia sẻ cho tất cả các thành viên để gửi các thông điệp bí mật. Như vậy chỉ cần quản lý N khóa, nếu một thành viên không còn đáng tin cậy thì chỉ cần loại bỏ khóa của thành viên đó ra khỏi nhóm mà không ảnh hưởng đến các khóa khác.

9.2.3.2     Bảo mật các máy chủ nhân bản

Xét trường hợp khá phức tạp, máy khách gửi yêu cầu đến nhóm các máy chủ nhân bản, các máy chủ có thể được nhân bản vì lý do đảm bảo tính chịu lỗi và hiệu năng, vì bất kỳ lý do nào thì máy khách chỉ mong đợi kết quả trả về đáng tin cậy. Xét trên góc độ bảo mật thông tin, máy khách không muốn trở thành nạn nhân của các vụ tấn công bảo mật, dù cho một trong số các máy chủ đã bị hư hỏng vì những cuộc tấn công đó. Máy khách có thể tập hợp kết quả trả về từ các máy chủ và xác thực chúng, nếu đa số đều được xác thực thì có thể tin cậy vào kết quả, tuy nhiên giải pháp này đã vi phạm tính trong suốt nhân bản.

Năm 1994 Reiter đã đề xuất giải pháp bảo mật máy chủ nhân bản nhưng vẫn duy trì được tính trong suốt nhân bản, máy khách không biết các bản sao thực sự, do đó có thể thêm hoặc bớt theo cách thức bí mật. Bản chất của bảo mật và các máy chủ nhân bản trong suốt nằm ở cách chia sẻ bí mật, tất cả đều biết bí mật nhưng không ai biết toàn bộ bí mật trừ khi họ tập trung lại với nhau. Trong trường hợp bảo mật, k trong số N máy chủ có thể trả về kết quả không chính xác và trong đó nhiều nhất là c ≤ k thực sự bị ảnh hưởng bởi tấn công bảo mật, cần thiết phải phân biệt giữa lỗi máy chủ với lỗi do tấn công bảo mật. Xét trường hợp máy khách gửi yêu cầu đồng thời đến N máy chủ nhân bản, để bảo đảm bí mật nhóm các máy chủ nhân bản thì mỗi kết quả trả về phải đính kèm chữ ký số. Ký hiệu ri là kết quả trả về của máy chủ Si, md(ri) là bản thu gọn bằng cách sử dụng khóa riêng K-i của máy chủ Si, hệ thống phải có khả năng chịu đựng được c máy chủ bị hủy hoại khi xảy ra tấn công bảo mật, như vậy vấn đề sẽ được giải quyết nếu có ít nhất c+1 chữ ký để đảm bảo chữ ký hợp lệ cho kết quả trả về.

 

Hình 9.19 Chia sẻ chữ ký bí mật trong nhóm các máy chủ nhân bản

 

Ví dụ trên hình 9.19, nhóm gồm 5 máy chủ nhân bản như vậy có thể chịu được 2 máy chủ sụp đổ khi xảy ra tấn công bảo mật. Mỗi máy chủ S i trả về kết quả ri kèm theo bản tóm tắt md(ri) trong chữ ký cho máy khách sig(Si, ri) = K-i (md(ri)), như vậy máy khách sẽ nhận được 5 cặp dữ liệu này. Máy khách tính toán bản tóm tắt cho mỗi kết quả trả về ri, nếu kết quả trả về ri không chính xác thì sẽ bị thể phát hiện khi thực hiện giải mã DK+i (DK-i (md(ri))), tuy nhiên phương pháp này không còn được sử dụng nữa vì không một máy chủ riêng nào được tin cậy. Thay vào đó, máy khách sử dụng hàm giải mã D với  đầu vào gồm ba tập chữ ký và cho ra  kết quả một bản tóm tắt:

d = D(sig(S,r), sig(S’,r’), sig(S”,r”))

Như vậy sẽ có tổng cộng 5!/(3!2!)=10 khả năng xảy ra, chỉ cần một trường hợp cho kết quả chính xác bản tóm tắt md(ri) đối với kết quả ri  nào đó thì có thể coi ri là kết quả trả về chính xác, máy khách có thể tin cậy kết quả trả về nếu có ít nhất 3 máy chủ cho kết quả xác thực chính xác. Ví dụ trên có thể được tổng quát hóa trên trường hợp n=N máy chủ và ngưỡng chịu đựng m = c+1 là ngưỡng chịu lỗi do bị tấn công bảo mật và gọi là lược đồ ngưỡng (m,n), áp dụng thực tế một bản tin sẽ được chia thành n phần và chỉ có thể dựng lại bản tin khi biết chính xác ít nhất m phần.

9.2.4    Xác thực bằng Kerberos

Có thể thấy việc kết hợp bảo mật vào trong hệ thống phân tán không phải đơn giản, chỉ cần một bộ phận không an toàn thì có thể tổn hại cho cả hệ thống. Để trợ giúp cho việc xây dựng các hệ thống phân tán có thể thực thi vô số các chính sách bảo mật, một số hệ thống hỗ trợ đã được phát triển và có thể sử dụng làm cơ sở cho việc phát triển tiếp, một trong những hệ thống đang được sử dụng rộng rãi là Kerberos. Kerberos dựa trên giao thức Needham-Schroeder và có thể coi như hệ thống bảo mật trợ giưps máy khách thiết lập kênh bí mật với máy chủ của hệ thống phân tán, tính bảo mật dựa trên các khóa bí mật chia sẻ. Hệ thống gồm hai thành phần, máy chủ xác thực AS có nhiệm vụ xử lý các yêu cầu đăng nhập của người sử dụng, nếu xác thực người sử dụng thành công sẽ cung cấp khóa để thiết lập các kênh bảo mật với máy chủ, thiết lập kênh bảo mật với máy chủ do dịch vụ cấp thẻ TGS thực hiện.

 

Hình 9.20 Xác thực trong Kerberos

 

Khi A đăng nhập vào hệ thống phân tán sử dụng Kerberos để thiết lập kênh bảo mật với B, máy khách sẽ gửi tên đăng nhập đến máy chủ AS và nhận được khóa KA,TGS và thẻ cần thiết để chuyển cho thành phần cung cấp dịch vụ TGS. Thẻ chứa định danh của A và chỉ có thành phần TGS mới đọc được thông tin này, vì vậy nó được mã hóa bằng khóa bí mật KAS,TGS. Máy khách của A sẽ mã hóa mật khẩu bằng khóa KA,AS, như vậy mật khẩu sẽ được mã hóa khi truyền trên mạng và máy khách cũng không lưu được bản rõ của mật khẩu, hơn nữa ngay sau khi khóa chia sẻ KAS được sinh ra thì máy khách sẽ tìm thấy khóa phiên K AS,TGS, có thể quên đi mật khẩu của A, chỉ sử dụng khóa bí mật chia sẻ KA,AS.

Sau khi hoàn thành xác thực, A có thể coi như đã thâm nhập vào hệ thống và thẻ sẽ được lưu tạm thời trong AS khoảng 8 đến 24 giờ và dùng để truy nhập các dịch vụ từ xa, tất nhiên A phải xỏa dữ liệu đã lưu trên máy khách. Nếu muốn nói chuyện với B, A phải yêu cầu khóa phiên cho B như trên hình 9.20, TGS sẽ trả về khóa phiên KA,B trong thẻ để sau này A sẽ chuyển cho B. Thông điệp thứ 6 chưa nhãn thời gian đã được mã hóa để chống lại tấn công lặp, TGS sẽ kiểm tra nhãn thời gian nếu quá hạn thì sẽ bị từ chối. Nếu A muốn làm việc với máy chủ khác của hệ thống mà không thay đổi máy khách thì không cần phải xác thực lại, về nguyên tắc các máy chủ đã ủy quyền xác thực cho máy chủ AS.

 

Hình 9.21 Thiết lập kênh bảo mật trong Kerberos

 

Việc thiết lập liên kết với B giờ đây đã trở nên đơn giản như minh họa trên hình 9.21, máy tính của A gửi cho máy tính của B thông điệp chứa thẻ đã nhận được cấp từ dịch vụ TGS kèm theo nhãn thời gian đã được mã hóa, máy tính của B nhận được sẽ giải mã và biết rằng A muốn nói chuyện với B vì chỉ có TGS mới xây dựng được thẻ này. Máy tính của B cũng nhận được khóa bí mật KA,B để kiểm tra nhãn thời gian, bằng thông điệp trả về EKA,B(t+1) sẽ chứng minh cho A tính chính danh của B.

9.3       Kiểm soát truy nhập

Trong mô hình khách/chủ, mỗi khi máy khách và máy chủ thiết lập kênh bảo mật, máy khách có thể gửi yêu cầu để máy chủ thực hiện, những yêu cầu đó đòi hỏi thực hiện các thao tác trên tài nguyên do máy chủ kiểm soát. Tài nguyên trên máy chủ gồm nhiều đối tượng và máy khách chỉ được phép thao tác trên các đối tượng đó nếu được cấp quyền truy nhập, việc kiểm tra quyền truy nhập còn gọi là kiểm soát truy nhập, hai khái niệm này liên quan mật thiết với nhau. Để bảo mật hệ thống cần thiết phải xây dựng các chính sách kiểm soát các thao tác của người sử dụng trên máy chủ, có thể xây dựng bức tường lửa hoặc một hệ thống kiểm soát truy nhập.

9.3.1    Nguyên lý kiểm soát truy nhập

Kiểm soát truy nhập đối tượng bao gồm tất cả những biện pháp bảo vệ đối tượng chống lại những thao tác bất hợp pháp trên đối tượng, đó có thể là những vấn đề liên quan tới quản lý hay những vấn đề liên quan tới thao tác trên đối tượng.

 

Hình 9.22 Nguyên lý kiểm soát truy nhập đối tượng

 

Việc bảo vệ do thành phần giám sát tham chiếu đảm nhiệm, thành phần này chứa danh sách những chủ thể được phép thực hiện thao tác, nó sẽ được sử dụng mỗi khi gọi đối tượng, như vậy thành phần này đóng vai trò rất quan trọng và không thể bị kẻ tấn công đánh lừa.

9.3.1.1     Ma trận kiểm soát truy nhập

Cách đơn giản nhất thường được áp dụng là xây dựng ma trận kiểm soát truy cập, đó là một ma trận gồm hàng biểu diễn cho một chủ thể truy nhập và cột biểu diễn cho tài nguyên, giá trị chứa trong mỗi phần tử của ma trận thể hiện quyền người sử dụng được thao tác trên tài nguyên đó. Ký hiệu ma trận là M, S là chủ thể truy nhập và O là đối tượng truy nhập, khi đó M[s,o] gồm danh sách những thao tác mà chủ thể S có thể thực hiện trên đối tượng O. Nếu chủ thể S thực hiện gọi thao tác trên m trên đối tượng O, thành phần giám sát tham chiếu sẽ kiểm tra xem thao tác m có xuất hiện trong danh sách M[s,o], nếu có thì cho phép thực hiện, ngược lại sẽ không cho phép tiếp tục thực hiện và như vậy lời gọi thao tác coi như thất bại.

Hình 9.23 Danh sách kiểm soát truy nhập

 

Thông thường hệ thống sẽ có rất nhiều người sử dụng và hệ thống có thể gồm hàng ngàn đối tượng cần được bảo vệ, do đó xây dựng một ma trận thực như trên là không hợp lý, nhiều mục trong ma trận sẽ rỗng. Giải pháp thứ nhất gọi là danh sách kiểm soát truy cập ACL (Access Control List), nghĩa là ma trận được phân tán theo cột và những mục rỗng sẽ bị bỏ qua, mỗi đối tượng sẽ duy trì danh sách các quyền truy nhập của các chủ thể muốn truy nhập đối tượng, như vậy mối đối tượng sẽ có một danh sách kiểm soát truy nhập riêng.

Hình 9.24 Kiểm soát theo khả năng

 

Giải pháp thứ hai là phân tán theo hàng, mỗi chủ thể sẽ được cấp những khả năng được phép thao tác với mỗi đối tượng tương đương với mỗi mục trong ma trận kiểm soát truy nhập. Khả năng được phép thao tác có thể coi như một tấm thẻ trên đó ghi những quyền được phép thực hiện, như vậy cần thiết phải có cơ chế để chủ thể sở hữu không được phép thay đổi các quyền trên tấm thẻ này. Hai giải pháp trên khác nhau ở  cơ chế vận hành kiểm soát, danh sách kiểm soát truy nhập cần phải biết chủ thể trong khi đó giải pháp sử dụng khả năng chỉ quan tâm tới thao tác yêu cầu thực hiện có xuất hiện trong danh sách khả năng hay không.

9.3.1.2     Miền bảo vệ

Danh sách kiểm soát truy nhập tuy đã khắc phục được nhược điểm của ma trận kiểm soát truy nhập bằng cách loại bỏ những mục rỗng, tuy nhiên kích thước của chúng vẫn còn rất lớn, để giảm kích thước của danh sách kiểm soát truy nhật thì cần phải đưa ra khái niệm miền bảo vệ. Miền bảo vệ là một tập các cặp đối tượng và quyền truy nhập, mỗi cặp xác định chính xác một đối tượng và các thao tác hợp lệ trên nó, các yêu cầu thực hiện thao tác đều thuộc một miền bảo vệ. Khi một chủ thể yêu cầu  thao tác trên đối tượng, tiến trình giám sát sẽ tìm trong miền bảo vệ liên quan với yêu cầu này để biết có được phép thực hiện hay không. Để đạt hiệu quả cao hơn, người ta dùng kết hợp miền bảo vệ với việc phân nhóm các đối tượng, việc phân nhóm các đối tượng có thể hiểu tương tự như cách quản lý vai trò của người sử dụng.

9.3.2    Tường lửa

Các giải pháp mã hóa kết hợp và cài đặt kiểm soát truy nhập sẽ hoạt động tốt khi các bên tham gia đều tuân thủ những qui tắc xác định, điều này chỉ đúng khi hệ thống phân tán cách ly với thế giới bên ngoài. Vấn đề trở nên phức tạp hơn khi hệ thống cung cấp các dịch vụ công cộng, để bảo vệ hệ thống chắc chắn sẽ cần thêm những giải pháp khác. Trong thực tế, truy nhập từ bên ngoài đến hệ thống phân tán phải được kiểm soát bằng một công cụ đặc biệt gọi là tường lửa. Tường lửa dùng để ngăn chặn các luồng không được phép, chúng có thể lọc thông tin từ mức mạng đến tầng ứng dụng, về nguyên tắc nó phải có khả năng bảo vệ chống lại các hiểm họa bảo mật và không bao giờ bị lỗi.

Hình 9.25 Cài đặt tường lửa

 

Về cơ bản, tường lửa gồm hai loại, tường lửa lọc gói tin và tường lửa lọc nội dung. Tường lửa lọc gói tin hoạt động như một thiết bị định tuyến cho phép hoặc không cho phép gói tin chuyển qua mạng dựa trên địa chỉ nguồn và địa chỉ đích của gói tin, thường dùng để ngăn chặn các gói tin từ ngoài đi vào trong mạng. Trường hợp hệ thống phân tán cài đặt trên nhiều mạng cục bộ thì có thể sử dụng mạng riêng ảo để kết nối các mạng này nhưng vẫn duy trì được tường lửa. Mạng riêng ảo  là một kênh truyền bảo mật trên môi trường mạng công cộng nhằm tiết kiệm về chi phí so với việc sử dụng các kênh thuê riêng, nó sử dụng các giao thức đường hầm cho phép đảm bảo tính toàn vẹn, bí mật thông tin, xác thực và mã hóa dữ liệu trên kênh truyền. Tường lửa mức ứng dụng không những kiểm tra thông tin điều khiển của gói tin mà còn kiểm tra nội dung của gói tin đó.

9.3.3    Bảo mật mã di động

Di trú mã là một trong những kỹ thuật nhằm nâng cao hiệu năng xử lý của hệ thống phân tán, tuy nhiên đây cũng là một trong những hiểm họa bảo mật. Các đoạn mã của Agent phải được bảo mật để chống lại những sửa đổi và đồng thời các máy tính cũng phải có khả năng chống lại những Agent độc hại.

9.3.3.1     Bảo vệ Agent

Agent di động lang thang trên hệ thống phân tán để tìm kiếm thông tin, tất nhiên phải có cơ chế bảo mật để sao cho khi đến một trạm nào đó bản thân Agent sẽ không bị đánh cắp hoặc sửa đổi thông tin. Rất tiếc cho đến nay chưa có một giải pháp đầy đủ nào để có thể thực hiện yêu cầu này, vì vậy cần tổ chức sao cho ít nhất cũng có thể phát hiện được những sửa đổi các Agent. Chủ sở hữu có thể phát hiện Agent đã bị giả mạo dựa trên ba cơ chế: trạng thái chỉ đọc, chỉ thêm nhật ký và tiết lộ trạng thái cho một số máy chủ nhất định. Trạng thái chỉ đọc của Agent gồm tập các mục dữ liệu đã được chủ sở hữu ký trước khi gửi đến máy tính khác, khi Agent trở về chỉ cần kiểm tra chữ ký có trùng khớp với nguyên gốc hay không. Cơ chế chỉ thêm nhật ký nghĩa là chỉ được phép thêm mà không được phép sửa hoặc xóa những bản ghi trước, ban đầu nhật ký rỗng và chỉ chứa giá trị kiểm tra Cinit=EK+Owner(N), trong đó K+Owner là khóa công khai của chủ sở hữu Agent và N là giá trị chứa định danh của chủ sở hữu. Khi Agent chuyển đến máy S, nó thêm dữ liệu X,S vào nhật ký kèm theo chữ ký sig(S,X) và tính giá trị kiểm tra mới Cnew=EK+Owner(Cold, sig(S,X),S) trong đó Cold là giá trị kiểm tra cũ. Lúc Agent trở về, chủ sở hữu dễ dàng phát hiện nhật ký có bị giả mạo hay không bằng cách đọc từ cuối nhật ký, giải mã DK-Owner(C), mỗi bước sẽ trả về giá trị kiểm tra của bước kế tiếp và chữ ký sig(S,X) cho máy S, nếu không bị giả mạo thì xử lý và thực hiện bước tiếp theo. Vòng lặp sẽ dừng lại khi tiến đến giá trị kiểm tra ban đầu hoặc khi phát hiện mục dữ liệu bị giả mạo. Cơ chế thứ ba được thực hiện bằng cách cung cấp một mảng mục dữ liệu, mỗi mục là một máy chủ xác định và được mã hóa bằng khóa công khai của máy chủ đó, toàn bộ mảng được chủ sở hữu Agent ký để đảm bảo tính toàn vẹn. Nếu một mục dữ liệu bị thay đổi giả mạo thì các máy chủ sẽ thông bao và có thể thực hiện các biện pháp thích hợp.

9.3.3.2     Bảo vệ đích

Bảo vệ mã di động chống lại những máy phá hoại là quan trọng nhưng bảo vệ các máy tính trước những mã di động phá hoại còn quan trọng hơn. Nếu coi việc gửi Agent ra thế giới bên ngoài là nguy hiểm thì nhìn chung người sử dụng có nhiều lựa chọn để lấy kết quả từ những Agent này, tuy nhiên để cho phép Agent thâm nhập vào hệ thống thì chỉ có duy nhất một cách là kiểm tra toàn bộ Agent, người sử dụng cần phải kiểm soát toàn bộ những gì Agent có thể thực hiện. Không có cách nào bảo vệ được Agent  trước những thay đổi mang tính chất phá hoại nhưng lại có thể phát hiện sửa đổi trên nó, trong tình huống xấu nhất thì từ chối tiếp nhận khi nó trở về. Có thể sẽ quá muộn nếu như phát hiện mã độc hại sau đã khi xâm nhập vào hệ thống, vì vậy cần phải bảo vệ tất cả các tài nguyên chống lại các đoạn mã tải xuống truy nhập trái phép. Một trong những cách bảo vệ là xây dựng hộp cát, đó là kỹ thuật kiểm soát toàn bộ tất cả các chỉ thị lệnh, nếu phát hiện thấy lệnh nào bị cấm thì dừng ngay chương trình. Tương tự như vậy, việc thực thi đoạn mã tải về sẽ bị tạm dừng nếu phát hiện thâm nhập vào thanh ghi hoặc những vùng nhớ máy tính không cho phép.

 

Hình 9.26 Cấu trúc hộp cát Java

 

Cài đặt hộp cát khá phức tạp, có thể kiểm tra mã thực hiện khi tải xuống và chèn thêm các chỉ thị lệnh cho những trường hợp chỉ có thể kiểm tra khi chạy, điều này khá đơn giản đối với những đoạn mã thông dịch. Mỗi chương trình viết bằng Java bao gồm các lớp và từ đó tạo ra các đối tượng, không có các biến toàn cục và các hàm, tất cả đều nằm được khai báo trong các lớp, việc thực thi chương trình bắt đầu tằ phương thức gọi hàm chính. Chương trình viết bằng Java được biên dịch thành các chỉ thị lệnh để từ đó sẽ được thông dịch bằng máy ảo Java, vì vậy máy ảo Java sẽ lần lượt xử lý từng chỉ thị lệnh của chương trình đã tải về bằng cách biên dịch thành các chỉ thị lệnh của nó, bắt đầu từ chương trình chính. Trong hộp cát Java, việc bảo vệ bắt đầu bằng cách đảm bảo thành phần xử lý chuyển chương trình đến máy khách có thể tin cậy, tải xuống trong Java do tiến trình nạp lớp đảm nhiệm. Mỗi thành phần nạp lớp có trách nhiệm lấy lớp xác định từ máy chủ và cài đặt trên không gian địa chỉ của máy khách, như vậy máy ảo Java có thể tạo các đối tượng từ những lớp đó. Vì thành phần nạp lớp chỉ là một lớp Java khác, chương trình đã tải về có thể chứa thành phần nạp lớp của riêng nó, hộp cát đầu tiên sẽ xử lý những thành phần nạp lớp đáng tin cậy sẽ được sử dụng, chương trình Java không cho phép tạo các thành phần nạp lớp riên nếu chúng phá vỡ phương thức nạp lớp thông thường vẫn xử lý.

Thành phần thứ hai của hộp cát là trình kiểm tra mã byte, nó kiểm ta xem lớp đã tải về có tuân thủ các qui tắc bảo mật của hộp cát hay không, đặc biệt nó kiểm tra xem lớp đó có chứa các chỉ thị lệnh bất hợp pháp hoặc những lệnh làm hỏng ngăn xếp hoặc bộ nhớ hay không. Không phải kiểm tra tất cả các lớp mà chỉ tập trung vào những lớp được tải từ máy chủ bên ngoài về máy khách, nói chung những lớp nằm trên máy khách đều đáng tin cậy. Khi tải xuống một lớp và đã kiểm tra an toàn, máy ảo Java có thể khởi tạo và thực hiện các phương thức của đối tượng, để ngăn chặn các đối tượng truy nhập trái phép vào tài nguyên của máy khách, trình quản lý bảo mật thực hiện những kiểm tra khác nhau trong khi chạy.

 

Hình 9.27 Hộp cát và sân chơi

 

Các chương trình tải về buộc phải sử dụng trình quản lý bảo mật để không có cách nào gây tổn hại, nghĩa là mọi thao tác đều phải tuân thủ yêu cầu của trình bảo mật. Trình bảo mật sẽ cấm nhiều thao tác như từ chối truy nhập vào các tập tin cục bộ và chỉ cho phép thiết lập kết nối đến các máy chủ nguồn gốc của các chương trình đã tải về, tuy nhiên chúng có thể tuy nhập đến thư viện đồ họa để phục vụ cho mục đích hiển thị hoặc bắt các sự kiện như di chuyển chuột hoạc bấm chuột vào các nút điều khiển. Trình bảo mật Java ban đầu được cài đặt rất khắt khe, chúng không phân biệt các chương trình đã tải từ những máy chủ khác nhau, trong nhiều tường hợp chúng đã giới hạn quá mức và cần thiết phải linh hoạt hơn.

Một cách tiếp cận khác tương tự như hộp cát nhưng linh hoạt hơn là tạo ra một sân chơi cho mã di động tải về, sân chơi là một máy riêng biệt chỉ dành cho mã di động đang chạy. Tài nguyên cục bộ như các tập tin và các kết nối đến máy chủ bên ngoài đều có sẵn cho các chương trình chạy tại sân chơi với các cơ chế bảo mật thông thường. Tuy nhiên các tài nguyên cục bộ đến các máy khác bị ngắt vật lý và mã tải về không thể truy nhập được, người sử dụng trên các máy khác có thể truy nhập đến sân chơi như cách thông thường, ví dụ gọi thủ tục từ xa, nhưng không một mã di động nào được tải về các máy cục bộ.

Hình 9.28 Nguyên lý sử dụng tham chiếu đối tượng

 

Hướng tới mục tiêu tăng độ linh hoạt đòi hỏi mỗi chương trình tài về phải được xác thực và sau đó thực thi chính sách bảo mật riêng dựa trên nguồn gốc của chương trình. Mục tiêu thứ nhất có thể thực hiện bằng cách sử dụng chữ ký cho mã di động như những văn bản thông thường, có thể áp dụng như một phương án dự phòng cho hộp cát, như vậy chỉ những mã máy chủ tin cậy mới được tiếp nhận. Vấn đề thứ hai thực thi chính sách bảo mật sẽ phức tạp hơn, có thể dựa trên việc sử dụng tham chiếu đối tượng như những khả năng được phép thực hiện, để truy nhập vào tài nguyên cục bộ thì phải tham chiếu đến đối tượng riêng xử lý các thao tác khi tải chương trình, nếu không có tham chiếu nào thì không được phép thực hiện. Ban đầu, chương trình không nhìn thấy tất cả các giao diện của đối tượng thao tác với tập tin hệ thống bằng cách không chuyển tham chiếu cho những giao diện này, như vậy đảm bảo không thể xây dựng bất kỳ tham chiếu nào tới một trong những giao diện đó trong thời gian chạy. Hơn nữa có thể sử dụng thuộc tính của Java để giữ cho biên và các phương thức hoàn toàn thuộc về bên trong của lớp, chương trình có thể được bảo vệ chống lại việc khởi tạo một đối tượng riêng xử lý tập tin bằng cách che giấu thao tác tạo các đối tượng mới từ một lớp đã cho.

 

 

Hình 9.29 Nguyên lý kiểm tra bên trong ngăn xếp

 

Cơ chế thứ hai thực thi chính sách bảo mật là kiểm tra bên trong ngăn xếp, về bản chất nghĩa là trước khi gọi bất kỳ phương thức truy nhập tài nguyên cục bộ thì phải gọi một thủ tục kiểm tra xem thủ tục đó có được phép gọi thủ tục thao tác với tài nguyên hay không, nếu được ủy quyền thì mở quyền tạm thời trong thời gian gọi thủ tục đó, trước khi trả quyền điều khiển cho phương thức gọi sẽ gọi thủ tục để đóng quyền truy nhập. Để gọi thủ tục mở/đóng quyền truy nhập, có thể yêu cầu lập trình viên giao diện đến tài nguyên cục bộ chèn những lời gọi này vào những vị trí thích hợp, tuy nhiên sẽ tốt hơn nếu để trình thông dịch của Java tự động xử lý những lời gọi này. Khi gọi đến tài nguyên cục bộ, trình thông dịch Java  tự động mở quyền thực hiện và kiểm tra xem lời gọi có được phép thực hiện hay không, nếu được thì đẩy lời gọi đóng quyền thực hiện vào ngăn xếp để đảm bảo chắc chắn quyền thực hiện sẽ bị cấm khi phương thức gọi trở về, giải pháp này ngăn chặn những lập trình viên phá hoại phá vỡ qui tắc

Phương pháp này cho phép kiểm tra tốt hơn quyền thực thi, giả sử chương trình gọi đối tượng cục bộ 01 và đối tượng đó lại gọi đối tượng 02, mặc dù đối tượng 01 có thể được cấp quyền gọi đối tượng 02, nếu chủ thể gọi đối tượng 01 không được tin cậy để gọi phương thức thuộc về đối tượng 02 thì kiểu gọi dây chuyền đó cũng không được phép. Kiểm tra bên trong ngăn xếp dễ dàng kiểm tra những chuỗi như vậy, trình thông dịch chỉ cần kiểm tra mỗi khung ngăn xếp bắt đầu từ đỉnh để biết khung nào đã mở quyền thực thi hoặc khung nào cấm truy nhập đến tài nguyên hiện hành. Về cơ bản có thể nói kiểm tra bên trong ngăn xếp cho phép đính kèm các quyền vào lớp hoặc phương thức và kiểm tra những quyền này cho mỗi lần gọi riêng biệt, bằng cách náy có thể thực hiện miền bảo vệ dựa trên lớp.

Cách tiếp cận thứ ba để thực thi chính sách bảo mật là quản lý không gian tên, để truy nhập đến tài nguyên cục bộ thì chương trình phải tích hợp những tập tin thích hợp chứa các lớp thực hiện những tài nguyên đó. Việc tích hợp đòi hỏi phải cung cấp tên cho trình thông dịch, sau đó phân giải thành lớp và sau đó được nạp trong thời gian chạy. Để thực thi chính sách bảo mật cho một chương trình tài xuống, cùng một tên có thể phân giải thành các lớp khác nhau tùy thuộc vào việc chương trình được tải từ đâu. Thông thường việc phân giải tên do thành phần nạp lớp xử lý, nó cần phải được điều chỉnh để thực hiện cách tiếp cận này.

Những cách tiếp cận trên liên kết quyền thực hiện  với các lớp và các phương thức dựa trên địa điểm tải chương trình xuống, với ưu điểm của trình thông dịch Java có thể thực thi chính sách bảo mật thông qua các cơ chế đã trình bày trên đây. Theo nghĩa này, kiến trúc bảo mật phụ thuộc vào ngôn ngữ bậc cao và cần phải phát triển ngôn ngữ mới. Các giải pháp độc lập ngôn ngữ đòi hỏi cách tiếp cận tổng quát hơn để thực thi bảo mật và cũng khó cài đặt hơn, trong những trường hợp này cần có sự trợ giúp bảo mật của bệ điều hành nhận biết mã di động tải xuống và thực thi tất cả những lời gọi đến tài nguyên cục bộ để chạy qua  phần lõi, nơi sẽ tiếp tục thực hiện kiểm tra.

9.3.4    Từ chối dịch vụ

Nói chung, kiểm soát truy nhập đảm bảo cẩn thận chỉ những tiến trình ủy quyền mới được truy nhập tài nguyên, một loại tấn công quấy nhiễu liên quan tới kiểm soát truy nhập bằng cách róc tâm ngăn cản những tiến trình đã được ủy quyền truy nhập tài nguyên. Việc phòng thủ chống lại những cuộc tấn công từ chối dịch vụ (DoS: Denial of Service) ngày càng trở nên quan trọng khi hệ thống phân tán đã mở trên toàn mạng Internet, nếu những cuộc tấn công này chỉ xuất phát từ vài điểm thì có thể dễ dàng xử lý, vấn đề sẽ phức tạp hơn nhiều khi phải chống lại những cuộc tấn công từ chối dịch vụ phân tán (DDoS: Distributed Denial of Service). Tấn công DDoS tập hợp một lượng rất lớn tiến trình để cố gắng triệt hạ dịch vụ mạng, kẻ tấn công đã thành công trong việc cướp một lượng lớn máy tính vô tình tham gia tấn công, chúng có thể chiếm hết băng thông hoặc tê liệt tài nguyên. Việc chiếm hết băng thông được thực hiện đơn giản bằng cách gửi rất nhiều thông điệp đến một máy làm cho những thông điệp bình thường khó có thể tiếp cận đến máy đó, tấn công tê liệt tài nguyên làm cho bên cung cấp dịch vụ không còn khả năng vận hành bình thường, ví dụ  làm cho máy tính ngập lụt trong việc xử lý các yêu cầu thiết lập liên kết của giao thức TCP.

Không có biện pháp đơn lẻ nào chống lại tấn công DDoS, kẻ tấn công cử dụng những nạn nhân vô tội bằng cách bí mật cài đặt phần mềm lên máy tính của họ. Trong những trường hợp này giải pháp duy nhất là phải có máy liên tục giám sát trạng thái bằng cách kiểm tra các tập tin bị nhiễm, xem xét bằng cách nào virus có thể phát tán trên mạng Internet. Chỉ dựa vào biện pháp đối phó này thì chưa đủ, cần thiết phải liên tục giám sát lưu lượng mạng, ví dụ bắt đầu từ những thiết bị định tuyến cửa ngõ của mạng. Kinh nghiệm cho thấy loại bỏ những gói tin có nguồn gốc không thuộc mạng của cơ quan có thể ngăn chặn rất nhiều những cuộc tàn phá, nói chung lọc được nhiều gói tin càng gần nguồn càng tốt. Hai trong số các nguyên tắc cơ bản về danh sách kiểm soát truy nhập, danh sách kiểm soát truy nhập chuẩn thì đặt càng gần đích càng tốt trong khi danh sách kiểm soát truy nhập mở rộng thì đặt càng gần nguồn càng tốt.

Có thể tập trung vào những thiết bị định tuyến cửa ngõ vào mạng của cơ quan, tuy nhiên điều này có thể đã quá muộn vì có thể sẽ chặn cả những người sử dụng thông thường. Tốt hơn hết là phải xử lý từ những thiết bị định tuyến của nhà cung cấp dịch vụ Internet bằng cách lọc những gói tin nghi là tấn công, thiết bị định tuyến sẽ loại bỏ những gói tin nếu phát hiện thấy tỉ lệ không cân đối giữa lưu lượng nhận và gửi từ một nút mạng nào đó. Nói chung, cần thiết phải triển khai rất nhiều biện pháp để chống lại tấn công từ chối dịch vụ, hơn nữa những hình thức tấn công mới càng ngày  càng đa dạng và hiểm độc hơn.

9.4       Quản lý bảo mật

Những phần trên đã xem xét các kênh bảo mật và kiểm soát truy nhập nhưng hầu như chưa đề cập đến vấn đề lấy các khóa như thế nào, phần này sẽ trình bày kỹ hơn về quản lý bảo mật. Thứ nhất cần xem xét quản lý chung các khóa mã hóa, cách phân phát các khóa này, từ đó thấy được tầm quan trọng của các chứng chỉ. Thứ hai là thảo luận quản lý bảo mật  nhóm các máy chủ bằng cách tập trung vào vấn đề thêm thành viên mới đã được thành viên hiện hành tin cậy, đối mặt với dịch vụ phân tán và nhân bản thì điều quan trọng là vấn đề bảo mật sẽ không bị ảnh hưởng khi tiếp nhận tiến trình độc hại vào nhóm. Vấn đề thứ ba chú trọng vào việc quản lý ủy quyền bằng cách xem xét những khả năng  và những thứ được gọi là chứng chỉ thuộc tính, vấn đề quan trọng trong các hệ thống phân tán liên quan đến quản lý ủy quyền là một tiến trình có thể ủy thác quyền truy nhập của nó cho một tiến trình khác.

9.4.1    Quản lý  khóa

Khi giới thiệu các giao thức mã hóa chúng ta đã ngầm hiểu các khóa đã sẵn sàng, ví dụ  trường hợp các hệ thống mã khóa công khai, bên gửi coi như đã biết khóa công khai của bên nhận để tùy ý sử dụng và như vậy mới có thể mã thóa thông điệp nhằm đảm bảo tính bí mật. Tương tự như vậy, trường hợp xác thực sử dụng trung tâm phân phối khóa KDC, mỗi bên tham gia cũng đã chia sẻ khóa bí mật với KDC. Tuy nhiên, việc thiết lập và phân phát khóa không phải vấn đề tầm thường, trong nhiều trường hợp phân phát khóa qua kênh không bảo mật  có thể nảy sinh vấn đề và vì vậy cần thiết phải sử dụng các biện pháp kênh ngoài. Tương tự như vậy cũng cần phải có biện pháp thu hồi khóa để ngăn chặn việc sử dụng khóa sau khi đã bị lộ hoặc không còn hiệu lực.

9.4.1.1     Thiết lập khóa

Khi thiết lập kênh bảo mật, bên gửi sẽ sử dụng khóa công khai của bên nhận để khởi tạo kênh truyền, nếu chấp thuận thì bên nhận sinh khóa phiên sau đó mã hóa bằng khóa công khai của bên gửi và để trả về cho bên gửi, bằng cách mã hóa khóa phiên trước khi gửi lên đường truyền thì có thể yêu tâm khóa đó sẽ được chuyển an toàn qua mạng. Dựa vào cách thức trên có thể sinh và phân phát khóa phiên khi hai bên đã chia sẻ khóa bí mật, tuy nhiên các bên tham gia đều phải có sẵn phương tiện để thiết lập kênh truyền bí mật, nghĩa là phải có một hình thức thiết lập và phân phối khóa đã được thực hiện, tương tự như vậy khi thiết lập với bên tin cậy thứ ba, ví dụ như trung tâm phân phối khóa KDC.

Hình 9.30  Nguyên lý trao đổi khóa Diffie – Hellman

 

Giao thức Diffie-Hellman đã được ứng dụng rộng rãi để thiết lập khóa chia sẻ qua kênh không an toàn, giả sử A và B muốn thiết lập khóa bí mật chia sẻ, cả A lẫn B đều tạo ra hai số lớn n và g, hai số này có thể được công khai. Bên A sẽ tạo ra một số lớn khác là x, bên B tạo ra số lớn y và giữ bí mật chúng, bên A sẽ gửi cho bên B các số n, g và (gx mod n), đây đều là những bản rõ vì gần như không thể tính được x khi chỉ biết giá trị (gx mod n).  Bên B thực hiện tính (gx mod n)y và về mặt toán học sẽ bằng (gxy mod n), đồng thời bên B cũng gửi cho bên A giá trị (gy mod n). Bên A thực hiện tính toán (gy mod n)x về mặt toán học cũng bằng (gxy mod n), như vậy chỉ duy nhất A và B mới biết khóa chia sẻ bí mật (gxy mod n), bản thân A và B cũng không cần biết giá trị x và y của nhau. Giao thức Diffie-Hellman có thể xem như một hệ thống mã hóa khóa công khai trong đó khóa riêng của A là x và khóa công khai của A là (gx mod n).

9.4.1.2     Phân phát khóa

Một trong những khâu phức tạp trong quản lý khóa là phân phát thực tế các khóa ban đầu, trong hệ thống mã hóa đối xứng, khóa bí mật chia sẻ ban đầu phải được trao đổi theo kênh bảo mật đảm bảo xác thực cũng như tính bí mật, nếu không sẵn có khóa nào cho các bên để thiết lập kênh bảo mật như vậy thì cần phải phân phát khóa băng ngoài, ví dụ gọi điện thoại hoặc gửi qua bưu điện.

Hình 9.31 Phân phát khóa bí mật

 

Trường hợp hệ thống mã hóa khóa công khai thì cần phân phát khóa công khai sao cho bên nhận có thể chắc chắn khóa đó là một cặp với khóa riêng đã yêu cầu, mặc dù không cần phải mã hóa khóa công khai nhưng nó phải được chuyển qua kênh xác thực. Trong thực tế, việc phân phát khóa công khai thực hiện bằng các phương tiện của chứng chỉ khóa công khai, chúng gồm khóa công khai kèm theo xâu ký tự xác định thực thể liên quan tới khóa đó, thực thể có thể là người sử dụng hoặc thiết bị mạng. Cả khóa công khai lẫn định danh đều được ký bởi cơ quan chứng nhận và chữ ký đó là đúng, định danh của cơ quan xác nhận đương nhien là một phần của chứng chỉ. Việc ký thực hiện bằng khóa riêng K-CA của cơ quan chứng thực, khóa công khai K+CA coi như đã biết, ví dụ có thể đăng tải trên các trang web.

 

Hình 9.32 Phân phát khóa công khai

 

Giả sử khách hàng muốn xác minh khóa công khai trong chứng chỉ có thực sự thuộc về một thực thể xác định hay không, họ sẽ sử dụng khóa công khai của cơ quan xác thực có liên quan để kiểm tra chữ ký của chứng chỉ, nếu chữ ký trên chứng chỉ trùng với cặp (khóa công khai, định danh thực thể) thì có thể chấp nhận khóa công khai thực sự thuộc về thực thể xác định và có thể tin tưởng chứng chỉ không bị giả mạo. Như vậy khách hàng đã coi khóa công khai K+CA là của cơ quan chứng thực có liên quan, nếu nghi ngờ thì có thể kiểm tra tính hợp lệ của K+CA thông qua chứng chỉ khác từ một cơ quan khác, ví dụ từ cơ quan chứng thực đáng tin cậy hơn. Mô hình tin cậy phân cấp trong đó cơ quan chứng thực cấp cao nhất được mọi người tin tưởng khá phổ biến, ví dụ thư bảo mật riêng (PEM: Privacy Enhanced Mail) sử dụng mô hình tin cậy ba mức, mức thấp nhất do cơ quan chứng thực chính sách (PCA: Policy Certification Authorities) xác thực, cơ quan này lại được tổ chức đăng ký chính sách Internet (IPRA: Internet Policy Registration Authority) xác thực. Nếu người sử dụng không tin tưởng IPRA thì cũng không hy vọng người đó sẽ tin tưởng những thông điệp thư điện tử gửi qua kênh bảo mật  PEM.

9.4.1.3     Thời gian sống của chứng chỉ

Một trong những vấn đề quan trọng là tuổi thọ của chứng chỉ, khóa công khai  của chứng chỉ sẽ luôn hợp lệ cho thực thể xác định bởi chứng chỉ đó, nếu khóa riêng của chứng chỉ bị lộ thì không nên sử dụng khóa công khai đó nữa, như vậy cần phải có cơ chế công khai tuyên bố chứng chỉ không còn hiệu lực. Giải pháp phổ biến là công bố danh sách thu hồi chứng chỉ (CRL: Certificate Revocation List), khách hàng phải kiểm tra xem chứng chỉ đã bị thu hồi hay chưa.  Nếu danh sách này công bố hàng ngày thì chứng chỉ bị lộ có thể được sử dụng cho đến thời điểm công bố kế tiếp, như vậy thời gian giữa những lần công bố không được phép quá dài. Giải pháp thứ hai là giới hạn thời gian cho mỗi chứng chỉ, quá thời hạn thì chứng chỉ không còn hiệu lực, trong thời gian còn hiệu lực thì vẫn có thể đưa chứng chỉ vào danh sách thu hồi. Giải pháp thứ ba là giảm thời gian tồn tại có hiệu lực của một chứng chỉ xuống gần bằng 0, khi đó máy khách luôn luôn phải kiểm tra chứng chỉ để xác định thời gian có hiệu lực của khóa công khai.

9.4.2    Quản lý bảo mật nhóm

Nhiều hệ thống bảo mật sử dụng các dịch vụ như KDC hoặc CA, điều đó chứng tỏ vấn đề phức tạp trong các hệ thống phân tán. Trước hết những đơn vị cung cấp dịch vụ đó phải đáng tin cậy, muốn cải thiện tính tin cậy trong các dịch vụ bảo mật thì phải cung cấp mức độ cao chống lại tất cả các hiểm họa bảo mật. Ví dụ, khi CA bị lộ thì không thể kiểm tra tính hợp lệ của khóa công khai làm cho toàn bộ hệ thống bảo mật hoàn toàn không còn giá trị. Mặt khác, các dịch vụ bảo mật phải có tính sẵn sàng cao, như vậy cần thiết phải nhân bản, nhưng nhân bản lại làm cho hệ thống dễ bị tấn công hơn. Vấn đề cần giải quyết là đảm bảo làm sao khi một tiến trình yêu cầu tham gia nhóm G thì tính toàn vẹn của nhóm không bị đe dọa. Giả sử các thành viên nhóm G sử dụng khóa bí mật CKG để mã hóa các thông điệp trong nhóm, nhóm còn có thêm một cặp khóa  công khai và khóa riêng (K+G, K-G) để giao tiếp với các thành viên của nhóm khác.

 

Hình 9.33 Qui trình tiếp nhận thành viên mới

 

Tiến trình P muốn tham gia vào nhóm G sẽ gửi yêu cầu tham gia JR, thời gian cục bộ T của tiến trình P,  bản trả lời RP (Reply Pad)  và khóa bí mật KP,G, RP và KP,G  được mã hóa cùng nhau sử dụng khóa công khai K+G của nhóm, JR được ký bởi tiến trình  P và  được gửi đi cùng với chứng chỉ chứa khóa công khai của P, ký hiệu [M] là thông điệp M do chủ thể A ký. Khi thành viên Q của nhóm nhận được yêu cầu tham gia, trước hết nó xác thực P sau đó sẽ liên lạc với các thành viên khác của nhóm để xem có nhận P làm thành viên của nhóm hay không. Việc xác thực P thực hiện theo cách thông thường bằng chứng chỉ, nhãn thời gian T dùng để xem chứng chỉ có còn hiệu lực tại thời điểm gửi yêu cầu hay không. Thành viên Q kiểm tra chữ ký của cơ quan chứng thực sau đó tách khóa công khai của P từ chứng chỉ để kiểm tra tính hợp lệ của JR, tại thời điểm này tiếp tục sử dụng giao thức riêng của nhóm để biết các thành viên khác có đồng ý kết nạp P hay không.

Nếu tiến trình P được phép tham gia vào nhms thì Q sẽ trả về thông điệp tiếp nhận chứa định danh của P và thẻ của nhóm N, phần RP dùng để mã hóa khóa liên lạc trong nhóm CKG, khóa riêng của nhóm K-G được mã hóa bằng khóa CKG. Toàn bộ thông điệp sẽ được Q ký bằng khóa KP,G, tiến trình P giờ đây có thể xác thực Q vì chỉ những thành viên của nhóm mới có thể nhận ra khóa KP,G, thẻ N trong giao thức không sử dụng cho việc bảo mật mà P sẽ mã hóa bằng khóa KP,G và gửi trở lại để thông báo cho Q biết P đã nhận được tất cả các khóa cần thiết và đã thực sự tham gia nhóm. Thay cho việc sử dụng RP, P và Q có thể sử dụng khóa công khai của P để mã hóa CKG, tuy nhiên RP chỉ được sử dụng một lần để mã hóa khóa truyền thông của nhóm trong thông điệp GA, sử dụng RP sẽ an toàn hơn. Nếu khóa riêng của P bị lộ thì có thể bị lộ khóa CKG và như vậy sẽ tổn hại đến bảm mật truyền thông của nhóm.

9.4.3    Quản lý ủy quyền

Quản lý bảo mật trong hệ thống phân tán liên quan mật thiết với việc quản lý quyền truy nhập, vấn đề quyền truy nhập ban đầu được gán cho người sử dụng hoặc cho nhóm và cách duy trì chúng như thế nào vẫn chưa được để cập tới. Trong hệ thống tập trung việc gán quyền truy nhập khá đơn giản, mọi công việc liên quan tới tài khoản đều được người quản trị hệ thống xác định trước. Trong hệ thống phân tán, vấn đề phức tạp hơn vì tài nguyên được đặt trên nhiều máy, áp dụng như hệ thống tập trung sẽ phải thiết lập tài khoản cho mỗi người sử dụng trên từng máy. Có thể giải quyết vấn đề đơn giản hơn bằng cách tạo tài khoản trên máy chủ trung tâm, mỗi lần người sử dụng truy nhập tài nguyên hệ thống sẽ tham khảo máy chủ này, về cơ bản phương pháp này giống như quản lý tài khoản trong hệ điều hành mạng.

9.4.3.1     Khả năng và chứng chỉ thuộc tính

Một cách tiếp cận tốt hơn đã được áp dụng rộng rãi trong các hệ thống phân tán là sử dụng các khả năng, khả năng là một cấu trúc dữ liệu không thể giả mạo cho một tài nguyên riêng biệt, nó xác định chính xác quyền truy nhập của người nắm giữ khả năng đối với tài nguyên đó. Có thể cài đặt các khả năng theo nhiều cách khác nhau, ví dụ hệ thống coi các đối tượng phân tán như những đối tượng từ xa đặt trên máy chủ, máy khách truy nhập đến đổi tượng thông qua tiến trình ủy quyền. Để thực hiện thao tác trên đối tượng, máy khách chuyển khả năng vào hệ điều hành cục bộ, hệ điều hành cục bộ sẽ xác định máy chủ chứa đối tượng cần truy nhập và sau đó thực hiện gọi thủ tục từ xa đến máy chủ đó.

Khả năng là một định danh 128 bit, với cấu trúc bên trong gồm bốn trường thống tin, 48 bit đầu tiên gọi là cổng máy chủ do máy chủ của đối tượng khởi tạo khi sinh đối tượng và có tác dụng trong việc tạo ra một định danh máy tính độc lập cho máy chủ của đối tượng. 24 bit tiếp theo được sử dụng để xác định đối tượng trên máy chủ đã cho, như vậy kết hợp với phần cổng máy chủ sẽ tạo ra 72 bit xác định đối tượng duy nhất trong toàn bộ hệ thống. 8 bit kế tiếp xác định quyền truy nhập của chủ thể nắm giữ khả năng, 48 bit cuối là trường kiểm tra và được dùng để bảo vệ làm cho khả năng không thể bị sửa đổi.

Hình 9.34 Cấu trúc định danh của khả năng

 

Khi tạo một đối tượng, máy chủ lấy một trường kiểm tra ngẫu nhiên và lưu trong khả năng và nội bộ trong một bảng riêng của nó, tất cả các bit của trường quyền truy nhập trong một khả năng mới được thiết lập bằng 1 và đó là khả năng trả về cho máy khách. Nếu máy khách yêu cầu thực hiện một thao thác thì phải gửi trả lại máy chủ  khả năng này, lúc đó trường kiểm tra sẽ dùng  để xác minh xem khả năng đã cấp có bị sửa đổi hay không. Để tạo khả năng giới hạn, máy khách có thể chuyển khả năng ngược trở lại máy chủ kèm theo mặt nạ bit cho quyền mới, máy chủ lấy trường kiểm tra gốc từ bảng của nó và thực hiện phép tính XOR với các bit của quyền mới và sau đó chạy kết quả qua hàm một chiều. Máy chủ tạo khả năng mới với trường đối tượng giữ nguyên nhưng các bit quyền mới và trường kiểm tra là kết quả đầu ra của hàm một chiều, khả năng mới này sẽ được trả về cho bên gọi và máy khách có thể gửi khả năng mới này cho tiến trình khác nếu muốn, ý nghĩa của trường quyền thực hiện thay đổi theo từng loại đối tượng.

Hình 9.35 Tạo khả năng hạn chế từ khả năng của chủ sở hữu

 

Khi quyền giới hạn quay lại máy chủ, máy chủ nhìn thấy trường quyền thực hiện khác với quyền của chủ sở hữu vì ít nhất một bit đã bị tắt, nghĩa là giá trị của bit bằng 0, máy chủ lấy số ngẫu nhiên gốc từ bảng của nó và thực hiện phép tính XOR với các bit trong trường quyền thực hiện của khả năng và chạy kết quả qua hàm một chiều, nếu kết quả trả về trùng với trường kiểm tra chứng tỏ khả năng đó là lợp lệ. Như vậy nếu người sử dụng thêm quyền chưa được cấp thì chứng chỉ sẽ không hợp lệ, đảo ngược trường kiểm tra trong khả năng giới hạn cũng không thể được vì đã sử dụng hàm một chiều. Về cơ bản hàm một chiều này cũng tương tự như tính toán chữ ký số, nếu thay đổi thông điệp ban đầu thì sẽ bị phát hiện ngay lập tức.

Một số hệ thống phân tán sử dụng chứng chỉ thuộc tính, về bản chất đó là bước tổng quát hóa các khả năng, không giống như chứng chỉ thông thường sử dụng khóa công khai để kiểm tra tính hợp lệ, chứng chỉ thuộc tính sử dụng danh sách cặp (thuộc tính, giá trị) để áp dụng cho một thực thể xác định. Đặc biệt, chứng chỉ thuộc tính có thể dùng để liệt kê các quyền truy nhập của chủ thể nắm giữ chứng chỉ đến một tài nguyên xác định. Tương tự như chứng chỉ, các chứng chỉ thuộc tính cũng được chuyển từ những cơ quan chứng thực cụ thể, các quyền truy nhập liệt kê trong chứng chỉ sẽ do  cơ quan chứng thực thuộc tính ký.

9.4.3.2     Ủy nhiệm

Ủy nhiệm là một kỹ thuật quan trọng để bảo vệ máy tính trong hệ thống phân tán, nó được thực hiện bằng cách chuyển quyền truy nhập từ tiến trình này sang tiến trình khác nhằm mục đích phân tán công việc giữa các tiến trình mà không làm ảnh hưởng tới việc bảo vệ tài nguyên. Giả sử người sử dụng A có quyền đọc tập tin, người sử dụng muốn in nhưng vì kích thước tập tin quá lớn, đáng lẽ phải gửi tập tin đến máy in thì người sử dụng chỉ gửi tên tập tin để tiến trình trên máy in có thể sao chép vào vùng đệm của mình. Vấn đề nằm ở chỗ tiến trình thực hiện in không có quyền truy nhập đến tập tin trên, vì vậy máy tính của người sử dụng sẽ từ chối tiến trình in của máy chủ khi truy nhập đến tập tin, vấn đề chỉ có thể giải quyết bằng cách người sử dụng tạm thời ủy nhiệm quyền truy nhập đến tập tin cho máy in.

Trong hệ thống phân tán các tiến trình có thể chạy trên những máy khác nhau và thậm chí trong những miền quản trị khác nhau, việc ủy nhiệm có thể tránh được chi phí cũng như bảo vệ thông thường được xử lý trên máy cục bộ. Giải pháp chung cho vấn đề này là sử dụng đại diện, đó là thẻ cho phép chủ sở hữu vận hành với những quyền hạn chế mà chủ thể đã cấp. Tiến trình có thể tạo đại diện với những quyền giống như nó đang có, nếu tiến trình tạo một đại diện mới dựa trên đại diện hiện hành đang có thì đại diện suy dẫn cũng sẽ bị hạn chế trong những quyền của đại diện gốc, thậm chí có thể bị hạn chế nhiều hơn. Vấn đề này có thể giải quyết bằng hai cách, nếu A biết tất cả các thành viên và A muốn ủy nhiệm quyền đọc cho B thì chỉ cần gửi chứng chỉ [A,B,R]A, B muốn chuyển quyền này cho C thì chỉ cần yêu cầu C phải liên hệ với A để nhận được chứng chỉ thích hợp.

Hình 9.36 Cấu trúc chung của đại diện dùng để ủy quyền

 

Cách thứ hai, A đưa ra chứng chỉ và bất cứ thành viên nào nắm được chứng chỉ này sẽ có quyền thực hiện như A đã cấp, như vậy trường hợp này sẽ phải có biện pháp chống lại việc sao chép chứng chỉ bất hợp pháp. Lược đồ Neuman xử lý trường hợp này, cũng giống như việc tránh vấn đề mà A cần phải biết tất cả những thành viên sẽ được ủy nhiệm. Lược đồ Neuman gồm hai phần, giả sử A là tiến trình đã tạo ra đại diện, phần thứ nhất là C=[R,S+Proxy]A bao gồm R là các quyền truy nhập đã cấp cho A và phần công khai của bí mật ký hiệu là S+Proxy được sử dụng để xác thực chủ nắm giữ chứng chỉ, chứng chỉ mạng theo chữ ký sig (A, C) của A để bảo vệ chống lại sửa đổi. Phần thứ hai chứa phần còn lại của bí mật ký hiệu là S-Proxy được bảo vệ để chống lại việc tiếp tục ủy nhiệm cho tiến trình khác. Nếu A muốn ủy nhiệm cho B một số quyền nào đó thì tạo danh sách R các quyền mà B có thể sử dụng, bằng cách ký vào danh sách, A sẽ ngăn chặn được B giả mạo nó. Tuy nhiên, chỉ ký thôi thì vẫn chưa đủ, nếu muốn sử dụng các quyền này thì có thể phải chứng minh B đã được sự nhận danh sách này từ A chứ không phải đánh cắp từ một chủ thể khác. Vì vậy A đặt ra câu hỏi hiểm hóc mà chỉ có nó mới biết câu trả lời, không một ai có thể kiểm chứng tính đúng đắn của câu trả lời đối với câu hỏi đã cho, câu hỏi này sẽ được thêm vào danh sách trước khi A thêm chữ ký. Khi ủy nhiệm một số quyền của mình, A thêm câu hỏi vào danh sách các quyền và ký trước khi gửi cho B và đồng thời cung cấp đáp án sao cho không một ai có thể lấy cắp. Khi truy nhập đến C, C sẽ lấy câu hỏi từ danh sách để hỏi lại B, nếu B trả lời đúng chứng tỏ A đã thực sự ủy nhiệm các quyền trong danh sách cho B. Như vậy, A không cần phải biết tất cả các thành viên trong hệ thống, thực tế B có thể chuyển các quyền trong danh sách cho D, bằng cách tương tự cũng trao cho D đáp án của câu hỏi để D có thể chứng minh danh sách đã được chuyển từ đối tượng có thẩm quyền. Áp dụng qui trình trên, A và B sử dụng khóa bí mật KA,B để mã hóa thông điệp trao đổi với nhau. Đầu tiên A gửi cho B chứng chỉ  C={R,S+Proxy} ký bằng sig(A,C), ký hiệu là [R,S+Proxy]A, không cần thiết phải mã hóa thông điệp này, chỉ có phần riêng của bí mật S-Proxy mới phải mã hóa bằng khóa KA,B.

 

Hình 9.37 Chứng minh sở hữu quyền truy nhập

 

Giả sử A được ủy quyền thực hiện một số thao tác trên đối tượng đặt tại máy chủ và  đã ủy nhiệm cho B những thao tác này,  nếu B muốn thao tác thực hiện trên đối tượng tại máy chủ thì phải chuyển ủy nhiệm cho máy chủ dưới dạng chứng chỉ đã ký [R,S+Proxy]A. Nhận được ủy nhiệm, máy chủ sẽ kiểm tra xem danh sách quyền thực hiện C có bị làm giả hay không hoặc yêu cầu B trả lời câu hỏi hiểm hóc. Tuy nhiên máy chủ vẫn chưa biết B có sở hữu toàn quyền chứng chỉ hay không, vì vậy phải sử dụng bí mật đính kèm với C. Máy chủ sử dụng khóa S+Proxy để mã hóa chuỗi định danh N và gửi cho B, B sử dụng khoá riêng S-Proxy để giải mã và gửi lại giá trị N để chứng minh biết bí mật và nắm toàn quyền của chứng chỉ.

9.5        Một số vấn đề bảo mật khác

Để đảm bảo an toàn cho thông tin trên hệ thống phân tán cần phải xây dựng các chính sách bảo mật, chính sách bảo mật cần phải được cụ thể hóa đến từng đối tượng và các thành phần trong hệ thống. Chính sách bảo mật máy chủ nhằm mục đích ngăn chặn truy nhập trái phép đến các máy chủ trong hệ thống, nội dung cơ bản của chính sách bảo mật máy chủ bao gồm chính sách bảo vệ vật lý và bảo vệ logic, chính sách bảo vệ vật lý bao gồm:

-         Tránh nguy cơ ảnh hưởng của môi trường: Để tránh ảnh hưởng của môi trường đến thiết bị, trung tâm dữ liệu cần có điều hòa nhiệt độ, điều hòa độ ẩm. Các tham số về môi trường trong trung tâm dữ liệu cần được giám sát và cảnh báo từ xa. Ngoài ra, phòng đặt trung tâm dữ liệu phải không bị ảnh hưởng của nhiễu từ trường.

-         Đối với nguồn cung cấp điện: Để tránh những nguy cơ về điện làm ảnh hưởng đến hoạt động của hệ thống mạng, trung tâm dữ liệu cần được cung cấp một nguồn điện ưu tiên đặc biệt hơn các phòng khác. Cần xây dựng hệ thống điện của công ty đủ và liên tục để cung cấp nguồn điện cho các thiết bị. Đối với nguồn điện cần sử dụng bộ lưu điện, máy phát điện, nguồn cung cấp dự phòng và nên chú ý vấn đề cách điện nhằm ngăn chặn cháy nổ do điện gây ra. Ngoài ra, cần sử dụng hệ thống cảnh báo, giám sát theo dõi các tham số nguồn điện từ xa.

-         Đối với việc bảo trì: Cáp sử dụng phải được đánh nhãn rõ ràng, cần bảo vệ tủ thiết bị để tránh đứt kết nối, lỏng đầu cắm cáp hay cắm sai cổng, các dây phải được bó gọn. Nên có một kho chứa các thiết bị dự phòng khi cần, thoát khỏi giao diện quản trị sau khi thực hiện xong công việc, bảo vệ truy cập đến cổng kết nối trực tiếp đến thiết bị phục vụ cho quản lý, khi thay thế hay thao tác trực tiếp với các thiết bị cần chú ý tránh sốc điện làm hỏng thiết bị.

Chính sách bảo vệ logic bao gồm:

-         Ghi chép thông tin cơ bản về máy chủ: Địa điểm lắp đặt, người chịu trách nhiệm quản lý trực tiếp, các thông tin về cấu hình và dịch vụ.

-         Việc thay đổi cấu hình phải tuân thủ các qui định  đã được phê duyệt.

-         Loại bỏ hoặc tạm ngừng các dịch vụ và ứng dụng không cần thiết.

-         Phải có qui trình theo dõi hoạt động của máy chủ.

-         Thường xuyên cập nhật và cài đặt các bản vá lỗi cho hệ điều hành và các ứng dụng trên máy chủ.

-         Hạn chế tối đa việc cấu hình tự động truy nhập hoặc cho phép truy nhập từ hệ thống khác.

-         Xây dựng qui trình sao lưu dự phòng dữ liệu.

-         Xây dựng chính sách truy nhập từ xa đến máy chủ.

-         Xây dựng qui định về bảo mật tài khoản truy nhập, qui định cách đặt tên và mật khẩu cho các tài khoản, thời gian quá hạn cho mỗi tài khoản.

Ngoài các chính sách trên, cần phải xây dựng chính sách bảo mật các máy khách  nhằm đảm bảo an toàn cho thông tin được lưu trữ trên các máy chủ và thông tin mà các máy khách truy nhập. Phát hiện đột nhập là khả năng phát hiện, nhận dạng mã độc tấn công vào mạng hoặc một máy tính nào đó. Hệ thống phát hiện đột nhập có khả năng phát hiện các kiểu tấn công thăm dò, tấn công truy nhập, tấn công từ chối dịch vụ (DDoS), worms, virus và có thể được cấu hình để gửi cảnh báo khi phát hiện những kiểu lưu lượng không rõ ràng. Ngăn chặn đột nhập là khả năng phát hiện và ngăn chặn việc thực thi các mã độc tấn công xâm nhập vào hệ thống, khi phát hiện có xâm nhập trái phép, một thiết bị cảm ứng sẽ thực hiện các bước sau:

1.      Gửi cảnh báo đến hệ thống quản lý giám sát

2.      Hủy bỏ phiên  kết nối

3.      Ngay lập tức vứt bỏ gói tin

4.      Từ chối các gói tin đến từ địa chỉ đã tấn công

 


CHƯƠNG 10:               CÔNG NGHỆ PHÁT TRIỂN HỆ THỐNG PHÂN TÁN

Hiện nay có nhiều công nghệ hỗ trợ cho việc phát triển các ứng dụng phân tán. Tùy theo đặc tính của hệ thống phân tán, chúng ta có thể lựa chọn các kỹ thuật như gọi thủ tục từ xa,  mô hình đối tượng thành phần phân tán DCOM của Microsoft, Java RMI, CORBA và dịch vụ web. Mô hình DCOM  của Microsoft cho phép gọi các đối tượng từ xa và chỉ chạy được trên nền tảng hệ điều hành của hãng Microsoft. Java RMI cũng là một kỹ thuật tốt, dễ dàng cài đặt và triển khai cho các hệ thống phân tán, tuy nhiên kỹ thuật này chỉ hỗ trợ ngôn ngữ Java, hiện kỹ thuật này đã được áp dụng phổ biến trong các ứng dụng di động. Kiến trúc môi trường yêu cầu đối tượng chung CORBA hỗ trợ nhiều ngôn ngữ lập trình, phù hợp cho việc phát triển các ứng dụng phân tán yêu cầu xử lý theo thời gian thực. Dịch vụ web có ưu điểm là dễ phát triển, phù hợp với các ứng dụng trên mạng Internet, tuy nhiên tốc độ xử lý được đánh giá là khá chậm, không đáp ứng yêu cầu thời gian thực. Trong chương này, chúng ta sẽ tập trung vào ba loại Java RMI, CORBA và dịch cụ web, đó là những mô hình dựa trên cách tiếp cận hướng đối tượng phân tán và chúng đang được ứng dụng rộng rãi để phát triển các ứng dụng phân tán.

10.1  Gọi thủ tục từ xa

Gọi thủ tục từ xa là phương thức cho phép thủ tục chạy trên một máy tính có thể gọi thủ tục chạy trên máy tính khác. Trên một máy tính, các thủ tục của tiến trình sử dụng chung một vùng nhớ và việc gọi hàm tương đối dễ thực hiện. Gọi thủ tục giữa hai máy tính thông qua kết nối truyền thông nào đó gọi là gọi hàm từ xa. Gọi thủ tục từ xa xuất hiện lần đầu trên các máy tính của Sun Microsystems và Hewlett-Packard chạy trên nền hệ điều hành UNIX. Các ứng dụng khách/chủ dùng RPC như một cơ chế truyền thông liên hệ thống. Gỉả sử một ứng dụng thuộc mô hình khách/chủ như một chương trình đã được phân chia, máy phục vụ chạy phần truy xuất dữ liệu bởi vì nó lưu trữ dữ liệu và máy khách chạy phần hiển thị dữ liệu bởi vì nó giao tiếp với người dùng. Theo sự sắp xếp này, RPC được xem như là thành phần kết hợp lại các phần phân chia của chương trình trên mạng.

Gọi thủ tục từ xa có khuynh hướng hoạt động theo thời gian thực vì chương trình gọi thường đợi đến khi nhận được trả lời từ chương trình được gọi. RPC được đòi hỏi trong các ứng dụng mà các thủ tục không được tiếp tục tới khi nó nhận được thông tin cần thiết từ hệ thống ở xa. Một biến tấu là sử dụng hoạt động đa luồng trong máy gọi thủ tục để nó có thể tiếp tục với các hoạt động khác trong khi chờ đợi trả lời từ máy được gọi. Một trong các vấn đề khi sử dụng RPC trong môi trường không đồng là các thiết bị khác nhau biểu diễn dữ liệu theo cách khác nhau. RPC tránh vấn đề này bằng cách thêm vào các cuộc gọi thông tin mô tả cách biểu diễn dữ liệu của bên gọi. Khi cuộc gọi được nhận, bên nhận chuyển đổi dữ liệu nếu hai máy biểu diễn dữ liệu khác nhau. RPC được thiết kế để cung cấp cho việc truyền tải thông tin giữa máy khách và máy chủ dễ dàng hơn, thuận tiện hơn cho việc đồng bộ hóa các luồn dữ liệu. Các hàm chứa trong RPC hỗ trợ cho việc truy cập bất kỳ chương trình nào đòi hỏi phương pháp giao tiếp từ máy khách đến máy chủ. Các thành phần của RPC bao gồm:

-         Tiến trình khách/chủ: Chương trình trên máy khách để gọi thủ tục từ xa hoặc dịch vụ trên máy chủ trả lời yêu cầu gọi thủ tục từ xa của máy khách.

-         Stub/Skeleton: Những chương trình con được máy khách/máy chủ sử dụng để khởi động yêu cầu gọi thủ tục từ xa. Máy khách sử dụng Stub để đóng gói các tham số và tên thủ tục thành những thông điệp gửi sang máy chủ, Skeleton trên máy chủ sẽ bóc tách thông tin từ thông điệp máy khách chuyển sang và gọi thủ tục cục bộ trên máy chủ sau đó lại đóng gói kết quả trả về để chuyển cho tiến trình trên máy khách.

-         Thủ tục sắp xếp NDR20 hoặc NDR64: Cung cấp một giao diện chung gọi thủ tục từ xa giữa máy khách và máy chủ và, giao diện NDR20 hay NDR64. NDR20 được dùng cho hệ thống 32 bit, trong khi đó NDR64 được tối ưu dùng cho hệ thống 64 bit. Máy khách và máy chủ sẽ thương lượng chọn NDR20 hay NRD64 để giao tiếp với nhau

-         Giao diện lập trình ứng dụng (API): Cung cấp giao diện gọi thủ tục từ xa cho máy khách và máy chủ. Thông thường, máy khách và máy chủ sẽ gọi hàm giao diện lập trình ứng dụng API để khởi tạo và chuẩn bị cấu trúc dữ liệu sẽ được sử dụng để thực hiện cuộc gọi thủ tục từ xa. Giao diện API sẽ quyết định yêu cầu gọi thủ tục từ xa đến từ thủ tục sắp xếp hoặc trực tiếp từ máy khách đến máy chủ nội bộ hoặc máy chủ từ xa, sau đó giao diện API sẽ dẫn đường cho liên kết gọi thủ tục từ xa.

-         Giao thức gọi thủ tục từ xa có liên kết: Được sử dụng khi việc gọi thủ tục từ xa yêu cầu giao thức liên kết, nó sẽ chỉ định sử dụng giao thức kết nối có liên kết trong việc gửi yêu cầu hoặc nhận kết quả trả về.

-         Giao thức gọi thủ tục từ xa không liên kết: Được sử dụng khi việc gọi thủ tục từ xa yêu cầu giao thức không liên kết, nó chỉ định sử dụng giao thức không liên kết trong việc gửi yêu cầu hoặc nhận kết quả trả về.

-         Giao thức gọi thủ tục từ xa cục bộ: Được sử dụng khi tiến trình gọi và tiến trình cung cấp dịch vụ gọi thủ tục từ xa đều trong cùng một máy.

-         Thành phần đăng ký: Được truy nhập khi dịch vụ gọi thủ tục từ xa đầu tiên được tải về. Các thành phần trong đăng ký sẽ chỉ định chuỗi cổng và địa chỉ, tên thiết bị của các card mạng để gọi thủ tục từ xa có thể kết hợp chúng lại với nhau. Thành phần đăng ký sẽ không được sử dụng trừ khi giao diện API ép buộc việc gọi thủ tục từ xa phải sử dụng.

-         Các thư viện liên kết động kernel32.dll, advapi32.dll, ntdll.dll, secur32.dll, rpcss.dll:  Kernel32.dll là tập tin thư viện liên kết động 32 bit có trong các hệ điều hành của hãng Microsoft, nó chịu trách nhiệm quản lý bộ nhớ, các hoạt động vào ra của hệ thống.  Advapi32.dll là tập tin nâng cấp của các hệ điều hành Windows 32 bit dựa trên giao diện lập trình ứng dụng, nó hỗ trợ về bảo mật và gọi các thành phần đăng ký. Ntdll.dll là tập tin thư viện liên kết động quản lý chức năng các tập tin hệ thống của hệ điều hành Windows. Tập tin thư viện liên kết động secur32.dll cung cấp giao diện bảo mật cho gọi thủ tục từ xa, nó thương lượng cách dùng cho việc chứng thực và mã hóa như Kerberos, NTLM hoặc SSL. Rpcss.dll chủ yếu cung cấp hạ tầng cho các dịch vụ mô hình đối tượng thành phần, nhưng một phần của Rpcss.dll được dùng cho điểm kết thúc động và đăng ký những điểm này vào cơ sở dữ liệu EPM. Khi máy khách muốn kết nối tới thủ tục từ xa trên máy chủ, nó sẽ liên lạc với EPM để phân giải những điểm kết thúc.

-         Thư mục hoạt động: Chỉ được sử dụng cho quá trình xử lý gọi thủ tục từ xa máy khách khi giao diện bảo mật cụ thể như Kerberos hoặc NTLM như nhà cung cấp bảo mật.

-         Ngăn xếp mạng và lõi: Được sử dụng thông qua các yêu cầu và trả lời của gọi thủ tục từ xa giữa máy khách và máy chủ.

Các thành phần của gọi thủ tục từ xa sẽ giúp cho các máy khách xử lý dễ dàng bằng cách gọi hàm nằm trên một chương trình ở xa. Máy khách và máy chủ có không gian địa chỉ riêng, nghĩa là mỗi nguồn tài nguyên bộ nhớ của máy khách và máy chủ cấp phát cho dữ liệu sẽ được các hàm trên máy cục bộ sử dụng. Quá trình xử lý gọi thủ tục từ xa bắt đầu từ phía máy khách, tiến trình khách sẽ gọi stub thay vì phải viết đoạn mã triển khai cho hàm đó, các stub sẽ được biên soạn và liên kết với các ứng dụng khách trong quá trình phát triển. Thay vì chứa mã đoạn mã để thực hiện thủ tục gọi hàm từ xa, các đoạn mã của stub sẽ yêu cầu truy vấn những tham số từ không gian địa chỉ của máy khách và sau đó chuyển chúng vào thư viện chạy thực trên máy khách, thư viện chạy thực của máy khách sẽ biên dịch những tham số cần thiết vào định dạng chuẩn NDR  để chuyển sang máy chủ.

Tiếp theo, stub sẽ gọi hàm trong thư viện chạy thực của máy khách rpcrt4.dll để gửi các yêu cầu và tham số của nó đến tiến trình chủ. Nếu tiến trình khách và tiến trình chủ đều chạy trên cùng một máy, thư viện chạy thực có thể sử dụng các tính năng của LRPC và thông qua các yêu cầu của gọi thủ tục từ xa tới phần lõi của hệ điều hành để chuyển đến tiến trình chủ. Nếu tiến trình chủ đặt trên máy khác, thư viện chạy thực sẽ xác định một giao thức truyền tải thích hợp và thông qua các yêu cầu của gọi từ xa đến ngăn xếp mạng cho việc truyền tải đến tiến trình chủ. Gọi thủ tục từ xa có thể dùng các cơ chế trao đổi khác như cơ chế đường ống hoặc socket để thực hiện truyền tải đến tiến trình chủ. Khi nhận được yêu cầu gọi thủ tục từ xa, các hàm trong thư viện chạy thực trên máy chủ tiếp nhận các yêu cầu và gọi hàm xử lýSkeleton, Skeleton sẽ truy vấn các tham số từ vùng đệm mạng và chọn NDR32 hoặc NDR64 sau đó chuyển đổi chúng từ định dạng truyền tải mạng sang định dạng theo yêu cầu của tiến trình  chủ, nghĩa là chuyển từ dạng thông điệp thành tên thủ tục và giá trị cảu các tham số. Sau đó các thủ tục từ xa sẽ được chạy, khi kết thúc, chuỗi các bước tương tự sẽ trả về dữ liệu cho máy khách.

Các thủ tục từ xa trả dữ liệu của nó về cho Skeleton, sử dụng NDR32 hoặc NDR64 để chuyển đổi những tham số được xuất ra thành định dạng truyền tải mạng đến máy khách và trả chúng vào thư việc chạy thực của máy chủ. Sau đó thư viện chạy thực của máy chủ sẽ truyền tải dữ liệu đến máy tính của Máy khách bằng LRPC hoặc qua mạng. Tiến trình khách hoàn tất các thủ tục bằng cách tiếp nhận dữ liệu qua mạng và trả dữ liệu về để gọi hàm, thư viện chạy thực của máy khách nhận được giá trị trả về  của thủ tục từ xa, chuyển đổi giá trị từ NDR32 hoặc NDR64 về định dạng theo yêu cầu của máy khách và trả về stub, stub sẽ bóc tách các tham số trong giá trị trả về để chuyển cho thủ tục đã gọi. Đối với hệ điều hành Windows của Microsoft, thư viện chạy thực gồm các thư viện liên kết ứng dụng và các thư viện liên kết động trong thời gian chạy.

10.2  Mô hình đối tượng thành phần phân tán

Để các đối tượng có thể liên lạc với nhau trong môi trường mạng, ActiveX sử dụng mô hình đối tượng thành phần phân tán DCOM, các đặc điểm cơ bản của mô hình DCOM bao gồm:

-         Cung cấp các dịch vụ cho ActiveX và OLE.

-         Hỗ trợ các giao diện API để gọi các đối tượng động và tĩnh.

-         Các đối tượng tương tác với nhau bằng cách sử dụng cơ chế gọi thủ tục từ xa RPC trong môi trường tính toán phân tán.

Ban đầu Microsoft phát triển mô hình đối tượng thành phần COM (Component Object Model), đó là một thành phần kiến trúc cơ bản của OLE để xác định giao diện gữa các đối tượng thành phần. Mô hình đối tượng thành phần phân tán DCOM (Distributed Component Object Model) là mô hình mở rộng của COM nhằm hỗ trợ truyền thông giữa các đối tượng trên nhiều máy khác nhau qua mạng máy tính.

10.2.1                    Các đặc trưng cơ bản của DCOM

DCOM là một mô hình nhằm hỗ trợ việc xây dựng các ứng dụng phân tán trên  cơ sở mô hình đối tượng, với việc dùng các phần mềm trung gian. Với tiêu chí đó, DCOM được thiết kế có các đặc trưng cơ bản như sau:

-         Độc lập vị trí (Location independence)

-         Độc lập ngôn ngữ (Language neutrality)

-          Quản lý kết nối (Connection management

-         Khả năng thay đổi quy mô (Scalability)

-         Hiệu năng (Performance)

-         Bảo mật (Security)

-         Cân bằng tải (Load balancing)

-         Tính chịu lỗi (Fault tolerance)

10.2.2                    Kiến trúc của DCOM

DCOM là mô hình phát triển kế tiếp của COM, nó xác định phương thức kết nối của các thành phần với các tiến trình trên máy khách, sự tương tác này có thể thực hiện trực tiếp mà không cần thành phần trung gian. DCOM có một số ưu điểm sau:

-         Hỗ trợ các giao diện ngôn ngữ hướng đối tượng

-         DCOM sẵn có trong các hệ điều hành Windows

-         Có khả năng giao tiếp dễ dàng với DCE.

-         Các mạng tương thích với DCOM có giá thành thấp

-         Có sự phân biệt rõ ràng của các giao diện và cài đặt

Cài đặt DCOM lại phụ thuộc nền tảng hệ thống (phần cứng, hệ điều hành), các đối tượng và các giao diện được lập trình phức tạp, không trực quan.

10.3  Kiến trúc môi trường yêu cầu đối tượng chung

Kiến trúc môi trường yêu cầu đối tượng chung CORBA (Common object request broker architecture) do nhóm quản lý đối tượng OMG đưa ra từ năm 1990. OMG cung cấp các sườn kiến trúc chung cho lập trình hướng đối tượng, trong đó mô tả rõ các kiến trúc quản lý đối tượng bao gồm: các chức năng môi trường yêu câu đối tượng ORB, các dịch vụ đối tượng, các phạm vi giao diện, các đối tượng ứng dụng. CORBA được xây dựng và phát triển dựa trên các đặc tả trên nhằm mục đích chuẩn hoá việc xây dựng các ứng dụng phân tán. Trong CORBA các đối tượng phân tán được định nghĩa để có thể lưu giữ và gọi từ xa, do đó nó phải đảm bảo tất cả các nhiệm vụ chung liên quan tới việc lập trình trên mạng bao gồm việc đăng ký đối tượng, gửi/nhận yêu cầu trên mạng...

10.3.1                    Các thành phần cơ bản của CORBA    

     CORBA bao gồm các tiêu chuẩn hỗ trợ việc phát triển các ứng dụng theo mô hình hướng đối tượng, trong đó các đối tượng có thể thực hiện trên một bộ xử lý hoặc được phân tán trên mạng. Để đạt được mục tiêu tích hợp các hệ thống của các nhà cung cấp  khác nhau, kiến trúc CORBA đảm bảo ba đặc điểm quan trọng sau:

-                                 Không phụ thuộc hệ điều hành và thiết bị phần cứng

-                                 Không phụ thuộc ngôn ngữ lập trình

-                                 Không phụ thuộc vị trí vật lý cài đặt các ứng dụng

 

 

 

 

 

 

 

 

 


Hình 10.1 Các thành phần cơ bản trong CORBA

 

Các đối tượng trong CORBA được thể hiện và cài đặt tương tự như các lớp trong ngôn ngữ lập trình hướng đối tượng do đó có tính tương thích cao và hoàn toàn độc lập với hệ điều hành. Nhằm mục đích chuẩn hoá kiến trúc này, nhóm OMG đưa ra các đặc tả  giao diện, hình 10.1 thể hiện các thành phần cơ bản trong kiến trúc CORBA. Thành phần cơ bản trong kiến trúc CORBA là môi trường yêu cầu đối tượng ORB, nó cung cấp các giao diện, dịch vụ và các phương tiện phục vụ cho các đối tượng CORBA. Khi ORB nhận được yêu cầu của máy khách nó chuyển yêu cầu đó đến máy chủ thích hợp. Theo cách lập trình khách/chủ truyền thống, máy khách phải biết tên và vị trí của máy chủ, phương pháp thiết lập và duy trì kênh liên lạc, phương pháp gửi/nhận các tham số. Trong CORBA, máy khách chỉ cần biết tên của thủ tục cần gọi và các tham số cần thiết để gửi/nhận, mọi thao tác khác do các thành phần của CORBA đảm nhiệm.

-         Các dịch vụ đối tượng: là các giao diện không phụ thuộc giao diện vùng để các đối tượng phân tán sử dụng, ví dụ dịch vụ xác định tên đối tượng, dịch vụ bảo mật..., các dịch vụ này được cài đặt độc lập với ORB.

-         Các phương tiện chung: là các phương tiện dùng cho tất cả các loại ứng dụng trên cho sản phẩm của các hãng khác nhau.

-         Giao diện vùng: thực hiện vai trò tương tự như các dịch vụ đối tượng và các phương tiện chung nhưng tập trung vào các lĩnh vực ứng dụng riêng, ví dụ CORBA cho viễn thông, CORBA cho tài chính, ngân hàng...

-         Các giao diện ứng dụng: là các giao diện riêng cho các ứng dụng đã xác định, giao diện này chưa được chuẩn hoá

 

 

 

 

 

 

 

 

 

 

 


Hình 10.2 Quá trình thực hiện yêu cầu của máy khách

 

10.3.1.1 Môi trường ORB

Môi trường ORB là thành phần cơ bản trong CORBA, đó là phần mềm nằm giữa lớp ứng dụng và lớp giao vận. Bản thân ORB không thuộc thành phần của hệ điều hành  mà là một dạng phần mềm trung gian dưới sự kiểm soát của hệ điều hành. Môi trường ORB đảm nhiệm các công việc sau:

-         Sẵn sàng nhận các yêu cầu của máy khách

-         Cung cấp tất cả các thủ tục cần thiết để tìm ra đối  tượng thực hiện yêu cầu của máy khách

-         Trao đổi dữ liệu và gửi yêu cầu đến thành phần cung cấp dịch vụ Servant

-         Cung cấp một số dịch vụ khi Servant yêu cầu trong thời gian thực hiện

Ứng dụng máy khách chỉ cần liên hệ với giao diện giao diện hoàn toàn độc lập với vị trí cài đặt đối tượng thực hiện.

-         Máy khách: là đối tượng yêu cầu dịch vụ.

-         Servant: là các đối tượng phục vụ yêu cầu của các máy khách, nó định nghĩa các thao tác, hỗ trợ giao diện IDL của CORBA.

-         ORB: là môi trường trung gian thiết lập quan hệ khách/chủ giữa các đối tượng. bằng cách sử dụng ORB, đối tượng máy khách có thể gọi các hàm trên máy cục bộ hoặc trên mạng.

-         Giao diện với môi trường ORB:  Cung cấp các giao diện để máy khách và Servant kết nối với nhau qua môi trường ORB.

-         Stub và Skeleton của ngôn ngữ IDL: Stub gồm các lệnh cho phép máy khách truy nhập tới các thành phần của máy chủ tương tự như cơ chế gọi gọi thủ tục từ xa. Skeleton gồm các lệnh trên máy chủ để liên lạc với các thành phần CORBA, nó đóng vai trò cầu nối giữa ORB với đối tượng thực hiện trên máy chủ.

-         Thành phần tích hợp BOA hoặc POA: Hỗ trợ ORB trong việc phân phát các yêu cầu đến các đối tượng thực hiện.

Hình 10.3 Cấu trúc và giao diện của ORB

 

Khi có yêu cầu, máy khách sử dụng giao diện gọi đối tượng động DII  hoặc sử dụng Stub của ngôn ngữ định nghĩa giao diện IDL, đối với một số chức năng máy khách có thể trực tiếp tương tác với môi trường ORB.  Môi trường ORB chuyển yêu cầu của máy khách đến đối tượng phục vụ Servant thông qua IDL Skeleton tĩnh hoặc Skeleton động. Có hai phương pháp định nghĩa giao diện: phương pháp tĩnh và phương pháp động. Theo phương pháp thứ nhất, giao diện được định nghĩa trong ngôn ngữ IDL để qui định các loại đối tượng và các thao tác trên đối tượng. Phương pháp thứ hai sử dụng dịch vụ kho lưu trữ giao diện để thể hiện các thành phần của giao diện như các đối tượng phục vụ và cho phép truy nhập các thành phần này trong thời gian chạy. Đối với môi trường ORB thì phương pháp sử dụng ngôn ngữ IDL hay sử dụng dịch vụ kho giao diện đều có ý nghĩa như nhau.

Ứng dụng máy khách khởi tạo yêu cầu bằng cách gọi các thủ tục  trong Stub liên quan đến đối tượng hoặc bằng cách tạo yêu cầu theo phương pháp động. Môi trường ORB xác định mã thực hiện thích hợp, chuyển các tham số và chuyển quyền điều khiển cho đối tượng phục vụ Servant thông qua Skeleton của ngôn ngữ IDL hoặc qua Skeleton động. Trong quá trình thực hiện đối tượng Servant có thể sử dụng một số dịch vụ của môi trường ORB thông qua thành phần thính nghi đối tượng. Khi thực hiện xong yêu cầu, quyền điều khiển và các giá trị trả về sẽ được chuyển cho ứng dụng máy khách.

Việc cài đặt môi trường ORB phải dựa trên các yêu cầu của hệ thống phân tán, đối với các hệ thống hạn chế về mặt tài nguyên nên cài đặt ORB tối thiểu và các ứng dụng phân tán sử dụng phương pháp tĩnh. Nếu có môi trường truyền thông thích hợp thì có thể cài đặt môi trường ORB thường trú trong ứng dụng máy khách và trong đối tượng phục vụ Servant. Stub có thể sử dụng cơ chế trao đổi thông tin liên tiến trình hoặc sử dụng dịch vụ xác định vị trí để thiết lập thông tin với đối tượng thực hiện trên máy chủ. Môi trường ORB có thể là chương trình bình thường cài đặt trên máy máy chủ giống như hệ điều hành đang sử dụng, liên lạc với máy khách và Servant vẫn được đảm bảo thông qua cơ chế trao đổi thông tin liên tiến trình. Để bảo đảm tính bảo mật, khả năng mở rộng và hiệu suất hoạt động của hệ thống, có thể cài đặt môi trường ORB như một dịch vụ của hệ điều hành đang sử dụng.

10.3.1.2 Ứng dụng  máy khách

Theo kiến trúc của CORBA, ứng dụng máy khách sử dụng tham chiếu đối tượng để gọi các hàm do đối tượng cung cấp. Để gọi một đối tượng cần phải tiến hành các bước như: xác định đối tượng sẽ gọi, hàm thực hiện và  các tham số cung cấp cho hàm cũng như giá trị trả về của nó. Môi trường ORB quản lý các quá trình chuyển quyền điều khiển và chuyển dữ liệu giữa đối tượng thực hiện và ứng dụng Máy trạm, ứng dụng Máy trạm gọi các hàm của đối tượng phục vụ tương tự như gọi các hàm trên máy cục bộ.

10.3.1.3 Đối tượng thực hiện

Đối tượng thực hiện là  các đối tượng bao hàm cả dữ liệu và các thao thác thực hiện trên dữ liệu, theo cách hiểu trong lập trình hướng đối tượng đây là các thể hiện của đối tượng. Chức năng thực hiện của đối tượng này hoàn toàn độc lập với môi trường ORB, môi trường này chỉ đảm nhiệm liên kết giữa máy khách và đối tượng thực hiện. Tham chiếu đối tượng là thao tác nhận thông tin cần thiết dụng để xác định một đối tượng thực hiện trong môi trường ORB, tương tự như mô hình lập trình trên một máy tính, có thể hình dung thao tác này tương tự như  thao tác lấy địa chỉ của đối tượng phục vụ. Để gọi các thao tác trên đối tượng phục vụ, máy khách phải nhận được tham chiếu đối tượng do môi trường ORB cung cấp. Môi trường ORB sử dụng phương pháp ánh xạ như nhau đối với tất cả các ngôn ngữ lập trình, vì vậy ứng dụng viết trên các ngôn ngữ khác nhau hoàn toàn có thể giao tiếp với nhau trong môi trường ORB của kiến trúc CORBA. Các yêu cầu cài đặt nói chung phụ thuộc nhiều vào ba yếu tố: thiết bị phần cứng, hệ điều hành và ngôn ngữ lập trình sử dụng để viết mã lệnh. Thành phần tích hợp đối tượng là phương tiện chủ yếu để Servant truy nhập các dịch vụ của ORB, nó đảm nhiệm các chức năng sau:

-         Tạo và biên dịch tham chiếu đối tượng

-         Gọi các hàm của đối tượng phục vụ

-         Bảo mật các tương tác giữa ứng dụng máy khách và các ứng dụng phục vụ

-         Kích hoạt và huỷ các đối tượng thực hiện

-         Ánh xạ tham thiếu đối tượng máy khách với các đối tượng phục vụ  tương ứng

-         Đăng ký việc cài đặt đối tượng phục vụ

Trong hệ thống có thể tồn tại nhiều thành phần thích nghi đối tượng và nó chỉ thích hợp cho một số loại đối tượng riêng. Thành  phần tích hợp đối tượng cơ bản BOA được định nghĩa trong phiên bản CORBA 1.0  với mục tiêu đơn giản và đáp ứng các mục đích cơ bản  để tích hợp đối tượng, do đó nó chỉ bao hàm các thao tác chính và được thể hiện trên hình 10.4 viết bằng ngôn ngữ IDL. Thành  phần tích hợp đối tượng cơ bản  định nghĩa ba trạng thái mà đối tượng có thể nhận được:

-         Trạng thái không tồn tại: đối tượng không tồn tại, môi trường ORB không xác định được đối tượng, vì vậy khi có yêu cầu gọi môi trường ORB sẽ từ chối phục vụ và gửi kèm theo thông báo lỗi.

-         Trạng thái tồn tại: Đối tượng đã được tạo ra và môi trường ORB nhận biết được đối tượng, tuy nhiên đối tượng có thể ở hai trạng thái sau:

o   Trạng thái không hoạt động: ứng dụng máy khách có thể nhận được tham chiếu đến đối tượng nhưng không thể thực gọi các thao tác thực hiện trên đối tượng.

o   Trạng thái hoạt động (active): ứng dụng Máy trạm có thể sử dụng tất cả các dịch vụ do đối tượng cung cấp.

Hình 10.4 Đặc tả thành phần tích hợp đối tượng cơ bản

 

Sự thay đổi trạng thái của các đối tượng được thực hiện trên máy chủ, hình 10.5 thể hiện chu kỳ sống của đối tượng và các hàm làm thay đổi trạng thái của nó. Thành phần tich hợp đối tượng động POA là thành phần trung gian giữa cài đặt đối tượng và môi trường ORB, nó được thiết kế không những để thay thế BOA mà còn đảm bảo hai đặc tính quan trọng sau:

-         Khả năng dễ dàng chuyển đổi: Cho phép các ứng dụng chạy trên các môi trường ORB khác nhau mà không cần thay đổi mã nguồn.

-         Tính linh hoạt: Cho phép kiểm soát chu kỳ sống và tính sẵn sàng của đối tượng phục vụ trong việc nhận các yêu cầu từ phía máy khách.

Hình 10.5 Chu kỳ sống của đối tượng sử dụng BOA

Mục tiêu của thành phần tích hợp POA bao gồm:

-         Cho phép lập trình viên xây dựng cài đặt đối tượng dễ dàng chuyển đổi giữa các sản phẩm ORB khác nhau.

-         Cho phép cài đặt đối tượng để cung cấp dịch vụ cho các đối tượng mà thời gian tồn tại của nó vượt quá thời gian phục vụ.

-         Hỗ trợ việc kích hoạt trong suốt các đối tượng.

-         Cho phép một Servant đồng thời hỗ trợ nhiều Object ID.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Hình 10.6 Kiến trúc của thành phần tích hợp động POA

 

Như vậy, trên đối tượng phục vụ có thể tồn tại nhiều POA, chúng được tổ chức theo phân cấp trong đó Root POA do môi trường ORB tạo ra, các POA khác do người sử dụng tạo lập và là các POA con. Hình 10.6 thể hiện kiến trúc và tương tác giữa các thành phần khác nhau của POA, chức năng của mỗi thành phần như sau:

-         Servant là các mã lệnh thể hiện các đối tượng phục vụ và được cài đặt trong các mô đun cung cấp dịch vụ.

-         Object ID là giá trị do POA sử dụng để xác định một đối tượng CORBA, các giá trị này do POA quản lý.

-         Tham chiếu đối tượng là thao tác trong mô hình đối tượng CORBA nhằm mục đích nhận tên của POA và Object ID, để đơn giản có thể hiểu thao tác này tương tự như việc lấy địa chỉ của một đối tượng.

-         Chương trình quản lý POA là đối tượng phục vụ cho việc quản lý trạng thái xử lý của POA, bằng  cách sử dụng các thao tác của chương trình quản lý này có thể thực hiện việc huỷ bỏ hoặc đưa vào hàng đợi các yêu cầu liên quan với POA. Thông qua chương trình quản lý POA, lập trình viên có thể đưa POA về trạng thái không hoạt động.

-         Chương trình quản lý Servant là một đối tượng mà người phát triển ứng dụng có thể gán với chương trình quản lý POA, môi trường ORB gọi các thao tác trên chương trình quản lý Servant để kích hoạt Servant theo yêu cầu hoặc đưa Servant về trạng thái không hoạt động. Chương trình quản lý Servant có nhiệm vụ quản lý mối liên kết  đối tượng đặc trưng bằng giá trị của Object ID với Servant tương ứng và quyết đinh sự tồn tại của đối tượng.

-         Kích hoạt bộ tích hợp là đối tượng mà người phát triển ứng dụng có thể gán với POA, ORB gọi thao tác trên thành phần này khi có yêu cầu đối với POA con nhưng POA con đó không tồn tại, nó có thể tạo POA cần thiết theo yêu cầu.

Mỗi POA có một bản đồ đối tượng hoạt động dùng để theo dõi Object ID của các đối tượng hoạt động và các Servant hoạt động tương ứng. Mỗi Servant được ánh xạ tương ứng với một hoặc nhiều Object ID trong bản đồ đối tượng hoạt động, việc xác định Servant và gán với đối tượng do trình quản lý Servant đảm nhiệm. Nhiệm vụ đồng bộ giữa các POA do chương trình quản lý POA thực hiện, chương trình quản lý này kiểm soát tính sẵn sàng của các POA nhận yêu cầu từ phía Máy trạm. Ngoài ra chương trình quản lý POA còn cung cấp các khả năng mở rộng để người sử dụng có thể tác động đến tiến trình xử lý yêu cầu:

-         Chương trình quản lý đối tượng phục vụ có thể điều khiển và giám sát chu kỳ sống của các đối tượng phục vụ.

-         Một đối tượng phục vụ mặc định có thể đồng thời phục vụ nhiều đối tượng

-         Trong trường hợp cần thiết, có thể sử dụng thành phần kích hoạt đối tượng tích hợp để tạo POA mới.

Khi nhận được yêu cầu từ phía Máy trạm, POA lựa chọn Servant và thực hiện việc gọi Servant đó.  Trên Máy chủ có thể tồn tại nhiều POA nhưng ít nhất có một POA gọi là root POA do môi trường ORB cung cấp, từ root POA này có thể tạo thêm các POA con và thiết lập cấu hình cho chúng để thực hiện các hành vi khác nhau đồng thời cũng có thể định nghĩa các tính chất của đối tượng do POA kiểm soát. Mỗi POA có tập các chính sách riêng nhằm mục đích thay đổi các thuộc tính của POA, các  chính sách đó do người sử dụng lựa chọn khi tạo lập POA và không thể thay đổi trong thời gian tồn tại của nó. Bản thân root POA đã có tập các chính sách được qui định trước và không thể thay đổi các chính sách đó, để có hành vi khác cần phải tạo ra POA con và thiết lập các chính sách cho nó, POA con không thừa kế các chính sách của POA cha.CORBA 2.0 qui định bảy chính sách của POA sau:

-         Chính sách về luồng xử lý: Qui định POA sử dụng trong môi trường đa luồng hay đơn luồng. Trong chế độ đa luồng POA xử lý đồng thời nhiều yêu cầu, trong chế độ đơn luồng các yêu cầu lần lượt được POA xử lý.

-         Chính sách về phạm vi tồn tại: thuộc tính này có thể nhận giá trị TRANSIENT hoặc PERSISTENT. Khi có yêu cầu từ phía máy khách, nếu POA ở trạng thái không kích hoạt và POA được đặt thuộc tính TRANSIENT  thì sẽ trả về lỗi OBJECT_NOT_EXIST, trường hợp POA có thuộc tính PERSISTENT thì môi trường ORB sẽ  tìm kiếm POA dựa trên tên và các POA cha hoặc thông báo cho dịch vụ định vị để tạo hoặc xoá bỏ POA.

-         Chính sách về tính duy nhất của tên định danh đối tượng: Qui định một đối tượng phục vụ có thể đăng ký với POA theo một hoặc nhiều tên định danh

-         Chính sách gán định danh: Qui định việc đặt định danh cho đối tượng phục vụ do POA hay do người sử dụng quyết định. Khi kích hoạt một đối tượng, định danh và đối tượng phục vụ tương ứng của nó thường được lưu trong bản đồ đối tượng hoạt động.

-         Chính sách duy trì đối tượng phục vụ: Qui định đối tượng phục vụ đã kích hoạt có được đăng ký trong bản đồ đối tượng hoạt động hay không.

-         Chính sách về xử lý yêu cầu: Qui định phương pháp xử lý khi nhận được yêu cầu từ phía máy khách theo một trong ba cách sau:

o   POA tìm kiếm đối tượng phục vụ yêu cầu trong bản đồ đối tượng kích hoạt.

o   Chuyển yêu cầu đến chương trình quản lý đối tượng phục vụ .

o   Sử dụng đối tượng phục vụ mặc định.

-         Chính sách kích hoạt ngầm định: Một số thao tác trên đối tượng phục vụ đòi hỏi đối tượng này phải ở trạng thái hoạt động, ví dụ thao tác nhận tham chiếu đối tượng, nếu thiết lập chính sách kích hoạt ngầm định sẽ loại bỏ thông báo lỗi trong các trường hợp trên.

Hình 10.7 Sơ đồ chuyển trạng thái của POA

 

Các chính sách của POA có mối liên hệ với nhau, việc đặt giá trị cho chính sách này có thể ảnh hưởng tới việc thiết lập các chính sách khác. Thành phần tích hợp đối tượng cơ bản BOA không có cơ chế đồng bộ các đối tượng phục vụ và không có khả năng kiểm soát tính sẵn sàng tiếp nhận các yêu cầu, nhược điểm này đã được POA khắc phục bằng cách đưa ra chương trình quản lý POA. Thực chất chương trình quản lý kiểm soát các trạng thái và các vấn đề liên quan đến việc chuyển trạng thái của  POA, hình 10.7 thể hiện các trạng thái của POA và các bước chuyển trạng thái của chúng.

-         Trạng thái hoạt động: Các yêu cầu từ phía Máy trạm sẽ được chuyển đến đối tượng phục vụ tương ứng để xử lý.

-         Trạng thái chờ: Các yêu cầu không được xử lý ngay mà chuyển đến hàng đợi để chờ xử lý

-         Trạng thái từ chối:  Các yêu cầu đều bị từ chối phục vụ và  ứng dụng Máy trạm nhận được mã lỗi TRANSIENT báo hiệu đã xảy ra sự cố tạm thời

-         Trạng thái không hoạt hoạt động: Tất cả các yêu cầu đều bị từ chối phục vụ.

Thao tác thiết lập POA và gán các đối tượng phục vụ được thực hiện theo các bước sau:

-         Nhận tham chiếu đến root POA: Tất cả các ứng dụng máy chủ phải nhận tham chiếu đến rootPOA để phục vụ cho việc quản lý các đối tượng hoặc tạo các POA mới, RootPOA do môi trường ORB quản lý và được khởi tạo bằng cách tạo đối tượng có tên là rootPOA.

-         Định nghĩa các chính sách cho POA: Qui định các chính sách cụ thể đối với POA phục vụ cho các yêu cầu riêng, nếu không thiết lập các tham số chính sách thì POA sẽ nhận các tham số mặc định.

-         Tạo POA con của root POA: Trong một ứng dụng không hạn chế số lượng POA, tuy nhiên POA con không kế thừa các chính sách của POA cha.

-         Tạo và kích hoạt đối tượng phục vụ: Mã lệnh thực hiện của đối tượng phục vụ phải được cài đặt trên máy chủ, để máy khách sử dụng các dịch vụ cần phải kích hoạt Servant bằng cách đăng ký định danh của đối tượng phục vụ trong bản đồ đối tượng hoạt động, thực chất đó là bảng dùng để ánh xạ tên định danh với đối tượng phục vụ tương ứng.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Hình 10.8 Các dịch vụ và các phương tiện của CORBA

 

Bình thường khi POA mới được tạo lập, trình quản lý POA ở trạng thái chờ, trong trạng thái này tất cả các yêu cầu đều được chuyển đến hàng đợi nhưng chưa được xử lý, để xử lý các yêu cầu đó, trình quản lý POA phải chuyển về trạng thái hoạt động. Trình quản lý POA thực chất là một đối tượng kiểm soát trạng thái của POA (trạng thái chờ, xư lý hay từ chối), nó gắn với POA ngay khi mới tạo lập. Trong giao diện tĩnh, đối tượng máy khách sử dụng các thủ tục Stub để gọi các hàm trong đối tượng phục vụ. Đối với giao diện động DII, đối tượng máy khách gọi các hàm của đối tượng phục vụ bằng cách sử dụng các thông tin lưu giữ trong kho giao diện. Giao diện Skeleton động cho phép các mã lệnh thực hiện trên Servant đăng ký với môi trường ORB các hàm thực hiện bằng cách mô tả các tham số của các thao tác. việc sử dụng giao diện này không nhất thiết đòi hỏi giao diện gọi đối tượng động DII tương ứng trên phía máy khách.

Môi trường ORB tạo điều kiện thuận lợi cho việc trao đổi thông tin giữa các đối tượng và để các đối tượng xác định nhau. Tuy nhiên các tính năng đó chưa đủ để xây dựng các ứng dụng phân tán qui mô lớn, đặc biệt đối với các ứng dụng thích hợp cho chuyên ngành hẹp, vì vậy hãng OMG đã đưa ra một số tính năng mới thể hiện dưới dạng các dịch vụ và các phương tiện như minh họa trên hình 10.8. Nhóm OMG chỉ nêu đặc tả các dịch vụ giao diện mà các dịch vụ cung cấp mà không thể hiện cách cài đặt các dịch vụ như thế nào, các dịch vụ đó độc lập với môi trường ORB và do đó số lượng dịch vụ phụ thuộc vào sản phẩm CORBA của từng hãng.

Dịch vụ đặt tên (Naming Service) là một trong các dịch vụ cơ bản nhất trong các dịch vụ của kiến trúc CORBA nói riêng và trong cac ứng dụng mạng nói chung, nó cho phép các ứng dụng máy khách xác định được đối tượng phục vụ bằng cách cung cấp tên sau đó sẽ nhận được tham chiếu đến đối tượng. Dịch vụ này  cho phép các đối tượng Servant được đăng ký và xác định bằng tên, nó sử dụng ngữ cảnh đặt tên để bảo đảm tập các tên là duy nhất.  Sự kết hợp giữa tên với đối tượng gọi là ràng buộc tên  và luôn được định nghĩa liên quan với ngữ cảnh của tên.

 

 

 

 

 

 

 

 

 

 

 


Hình 10.9  Mô hình dịch vụ đặt tên

 

Dịch vụ đặt tên cho phép kết hợp một hoặc nhiều tên logic với một tham chiếu đối tượng, lưu giữ các tên trong không gian tên dưới dạng  phân cấp và cho phép đăng ký tên đối tượng trong thời gian chạy. Các ứng dụng máy khách có thể tìm ra đối tượng cần sử dụng bằng cách xác định tham chiếu đối tượng trong không gian tên, qui trình của dịch vụ này được thể hiện trên hình 10.9. Hàm bind(name,objRef) dùng để tạo ràng buộc tên, hàm resolve(name) xác định đối tượng ràng buộc với tên trong ngữ cảnh đã cho. Dịch vụ đặt tên được mô tả trong mô đun CosNaming và được viết dưới dạng ngôn ngữ IDL  như sau:

module CosNaming

{

typedef string Istring;

struct NameComponent {

Istring id;

Istring kind;

};

typedef sequence <NameComponent> Name;

enum BindingType {nobject, ncontext};

struct Binding {

Name binding_name;

BindingType binding_type;

};

typedef sequence <Binding> BindingList;

interface BindingIterator;

interface NamingContext {

enum NotFoundReason { missing_node, not_context, not_object};

exception NotFound {

NotFoundReason why;

Name rest_of_name;

};

exception CannotProceed {

NamingContext cxt;

Name rest_of_name;

};

exception InvalidName{};

exception AlreadyBound {};

exception NotEmpty{};

void bind(in Name n, in Object obj)

raises(NotFound, CannotProceed, InvalidName, AlreadyBound);

void rebind(in Name n, in Object obj)

raises(NotFound, CannotProceed, InvalidName);

void bind_context(in Name n, in NamingContext nc)

raises(NotFound, CannotProceed, InvalidName, AlreadyBound);

void rebind_context(in Name n, in NamingContext nc)

raises(NotFound, CannotProceed, InvalidName);

Object resolve (in Name n)

raises(NotFound, CannotProceed, InvalidName);

void unbind(in Name n)

raises(NotFound, CannotProceed, InvalidName);

NamingContext new_context();

NamingContext bind_new_context(in Name n)

raises(NotFound, AlreadyBound, CannotProceed, InvalidName);

void destroy( )

raises(NotEmpty);

void list (in unsigned long how_many,out BindingList bl, out BindingIterator bi);

};

interface BindingIterator {

boolean next_one(out Binding b);

boolean next_n(in unsigned long how_many, out BindingList bl);

void destroy();

};

};

 

Mô dun CosNaming bao gồm hai thành phần giao diện chính:

-         Giao diện NamingContext: Cung cấp các thao tác phục vụ cho việc nhúng các đối tượng và giải quyết các vần đề về ngữ cảnh của tên.

-         Giao diện BindingIterator: Cung cấp các thao tác lặp lại việc nhúng các đối tượng.

Các ứng dụng dựa trên kiến trúc CORBA phải có cơ chế đồng bộ giữa các đối tượng khi thực hiện, dịch vụ dịch vụ sự kiện (Event Service) cung cấp các công cụ để các đối tượng CORBA có thể gửi/nhận các sự kiện, dịch vụ này phải đảm bảo các yêu cầu sau:

-         Đảm bảo việc phân phát sự kiện chính xác, đối tượng CORBA chỉ đưa sự kiện vào và sẽ đảm bảo sự kiện đó đến đích theo yêu cầu.

-         Các sự kiện được phân phát theo kiểu hàng đợi.

-         Cho phép các tin báo nặc danh, bên gửi/nhận không cần biết tên định danh của bên kia.

-         Cho phép kênh sự kiện, bên nhận được phép đăng ký chỉ  nhận một số loại sự kiện.

Dịch vụ sự kiện thực hiện việc liên lạc giữa các đối tượng, để đảm nhiệm vai trò này nó định nghĩa hai vai trò cho đối tượng: vai trò cung cấp sự kiện và vai trò sử dụng sự kiện, trao đổi dữ liệu của sự kiện giữa bên phát sinh và bên xử lý được thực hiện bằng cách đưa ra các yêu cầu theo tiêu chuẩn CORBA. Để phục vụ việc trao đổi thông tin giữa bên phát sinh và bên xử lý sự kiện, kiến trúc CORBA đề xuất hai mô hình sau:

-         Mô hình đẩy: Cho phép bên phát sinh sự kiện chủ động kích hoạt việc truyền dữ liệu của sự kiện đến bên sử dụng, như vậy phía phát sinh sự kiện đóng vai trò chủ động.

-         Mô hình kéo:  Cho phép bên xử lý sự kiện được phép yêu cầu dữ liệu từ bên phát sinh sự kiện, bên xử lý sự kiện đóng vai trò chủ động.

Hai mô hình trên cùng thực hiện nhiệm vụ trao đổi thông tin giữa bên phát sinh và bên xử lý sự kiện, trong mô hình thứ nhất bên phát sinh sự kiện chủ động kích hoạt việc chuyển dữ liệu cho bên xử lý, trong mô hình thứ hai bên xử lý sự kiện chủ động chuyển dữ liệu. Để thực hiện các yêu cầu của dịch vụ này, nhóm OMG đưa ra đặc tả gồm bốn mô đun: CosEventComm, CosEventChannelAdmin, CosTypedEventComm, CosTypedEventChannelAdmin. Ví dụ, mô đun CosEventComm đảm nhiệm chức năng liên lạc giữa bên phát sinh và bên xử lý sự kiện, nó cung cấp bốn giao diện và được thể hiện trên ngôn ngữ IDL như sau:

module CosEventComm {

exception Disconnected{};

interface PushConsumer {

void push (in any data) raises(Disconnected);

void disconnect_push_consumer();

};

interface PushSupplier {

void disconnect_push_supplier();

};

interface PullSupplier {

any pull () raises(Disconnected);

any try_pull (out boolean has_event)

raises(Disconnected);

void disconnect_pull_supplier();

};

interface PullConsumer {

void disconnect_pull_consumer();

};

};

Giao diện PushConsumer dùng để nhận dữ liệu của sự kiện, như vậy bên cung cấp sự kiện sử dụng hàm push(...) để truyền dữ liệu cho bên nhận sự kiện. Giao diện PushSupplier cung cấp hàm disconnect_push_supplier() để giải phóng các tài nguyên mà bên cung cấp sự kiện đã dùng trong quá trình truyền sự kiện. Giao diện PullSupplier dùng để phát đi dữ liệu của sự kiện, bên sử dụng sự kiện gọi hàm pull()  hoặc try_pull(...) để yêu cầu nhận dữ liệu của sự kiện. Giao diện PullConsumer cung cấp hàm disconnect_pull_consumer để kết thúc việc trao đổi thông tin và giải phóng các tài nguyên mà bên sử dụng sự kiện đã dùng để hỗ trợ cho việc truyền sự kiện. Giữa đối tượng phát sinh sự kiện và đối tượng xử lý sự kiện thường được cài đặt lớp trung gian gọi là Event Channel (kênh sự kiện), đây là dịch vụ đóng cả hai vai trò: phát sinh và xử lý sự kiện. Thực chất việc cài đặt  kênh sự kiện nhằm mục đích hỗ trợ cho việc trao đổi thông tin theo mô hình nhiều đối tượng phát sinh sự kiện với nhiều xử lý sự kiện đồng thời tăng hiệu suất hoạt động của hệ thống.

 

 

 

 

 

 

 

 

 

 

 

 


Hình 10.10 Nguyên tắc dịch vụ duy trì bền bỉ

 

Dịch vụ bền bỉ cung cấp giao diện chung để bảo đảm việc duy trì và quản lý trạng thái liên tục của các đối tượng. Khi quá thời hạn tồn tại, thường các đối tượng sẽ được lưu trong cơ sở dữ liệu và khi cần thiết có thể phục hồi lại. Trạng thái của một đối tượng gồm hai phần: trạng thái động và trạng thái  bền vững. Trạng thứ nhất là  thể hiện khi đối tượng được lưu trong bộ nhớ, điều đó không đảm bảo tính an toàn của dữ liệu khi xảy ra sự cố vì vậy đối tượng sử dụng trạng thái bền để có thể dễ dàng khôi phục trạng thái động. Hình 3.10 minh hoạ cơ chế hoạt động của dịch vụ trạng thái bền vững với nguyên tắc các đối tượng được lưu trong từng bộ lưu trữ gốc trong kho dữ liệu, mỗi tiến trình tạo ra các thể hiện của đối tượng và ánh xạ tương ứng với các đối tượng trong kho dữ liệu. Để truy nhập vào đối tượng trong kho dữ liệu cần thiết phải tạo liên kết giữa tiến trình với kho dữ liệu và nhúng đối tượng logic với đối tượng lưu trong kho dữ liệu, như vậy việc cập nhật các biến đối tượng sẽ kéo theo việc cập nhật đối tượng tương ứng trong kho dữ liệu.

Dịch vụ chu kỳ sống qui định các qui tắc để tạo/xoá/sao chép/di chuyển các đối tượng CORBA. Các môi trường dựa trên kiến trúc CORBA hỗ trợ các đối tượng phân tán, do đó dịch vụ này xây dựng các qui ước để  ứng dụng máy khách có thể thực hiện các thao tác trên đối tượng phân tán tại các vị trí khác nhau. Trong thực tế các thao tác này thường gặp những vấn đề sau:

-         Vấn đề khi tạo một đối tượng mới: Ứng dụng máy khách cần phải kiểm soát được vị trí để tạo đối tượng mới và vị trí đó phải được quyết định theo chính sách quản trị. Khi tạo một đối tượng mới ứng dụng máy khách phải tìm ra thực thể tạo lập đối tượng và liên kết với thực thể đó để tạo đối tượng mới, mức độ ảnh hưởng của máy khách đối với các giá trị ban đầu của đối tượng mới tạo lập

-         Vấn đề di chuyển hoặc sao chép đối tượng: Ứng dụng máy khách có thể kiểm soát được vị trí của đối tượng nguồn và đích tuân thủ theo chính sách quản trị. Trong qua trình này ứng dụng máy khách phải liên kết với thực thể phục vụ cho việc sao chép hoặc di chuyển đối tượng đồng thời xác định những ảnh hưởng đối với mã lệnh thực hiện của các đối tượng được sao chép hoặc di chuyển.

-         Ảnh hưởng đến các đối tượng khác: Các đối tượng phân tán thường có mối liên kết với nhau và gọi là quan hệ giữa các đối tượng, việc sao chép/di chuyển hoặc xoá các đối tượng có thể sẽ ảnh hưởng tới các đối tượng khác, vì vậy cần phải xác định ranh giới quan hệ của đối tượng khi thực hiện các thao tác trên.

Để giải quyết các vấn đề trên, dịch vụ chu kỳ sống xây dựng mô hình xử lý của máy khách về chu kỳ tồn tại cho đối tượng phục vụ cho các thao tác tương ứng khi  tạo lập, xoá, sao chép và di chuyển các đối tượng. Đặc tả của dịch vụ này viết trên ngôn ngữ IDL như sau:

#include <CosNaming.idl>

#pragma prefix “omg.org”

module CosLifeCycle{

typedef CosNaming::Name Key;

typedef Object Factory;

typedef sequence <Factory> Factories;

typedef struct NVP {

CosNaming::Istring name;

any value;

} NameValuePair;

typedef sequence <NameValuePair> Criteria;

exception NoFactory {

Key search_key;

};

exception NotCopyable { string reason; };

exception NotMovable { string reason; };

exception NotRemovable { string reason; };

exception InvalidCriteria{Criteria invalid_criteria; };

exception CannotMeetCriteria {Criteria unmet_criteria; };

interface FactoryFinder {

Factories find_factories(in Key factory_key)

raises(NoFactory);

};

interface LifeCycleObject {

LifeCycleObject copy(in FactoryFinder there,

in Criteria the_criteria)

raises(NoFactory, NotCopyable, InvalidCriteria,

CannotMeetCriteria);

void move(in FactoryFinder there,

in Criteria the_criteria)

raises(NoFactory, NotMovable, InvalidCriteria,

CannotMeetCriteria);

void remove()

raises(NotRemovable);

};

interface GenericFactory {

#ifdef NO_ESCAPED_IDENTIFIERS

boolean _supports(in Key k);

#else

boolean _supports(in Key k);

#endif

Object create_object (

in Key k,

in Criteria the_criteria)

raises (NoFactory, InvalidCriteria,

CannotMeetCriteria);

};

};

Một đối tượng Factory có nhiệm vụ tạo ra các đối tượng mới, ứng dụng máy khách liên tạo đối tượng mới bằng cách tham chiếu đến đối tượng Factory và gửi yêu cầu tạo lập đối tượng. Giao diện LifeCycleObject cung cấp các thao tác liên quan tới sự tồn tại các đối tượng. Để thực hiện các thao tác này, trước hết máy khách phải nhận tham chiếu đến đối tượng LifeCycleObject sau đó gọi các thao tác tương ứng. Dịch vụ điều khiển tương tranh cung cấp giao diện để quản lý tương tranh trong các đối tượng CORBA nhằm mục đích đảm bảo cho tất cả các ứng dụng máy khách có thể đồng thời truy nhập các tài nguyên chung nhưng vẫn đảm bảo tính nhất quán của tài nguyên chung đó. Dịch vụ này điều khiển sử dụng tài nguyên chung bằng khoá đọc/ghi, mỗi khoá được gán với một tài nguyên và một ứng dụng máy khách và ứng dụng máy khách phải nhận được khoá trước khi truy nhập vào tài nguyên chung. Dịch vụ điều khiển tương tranh được định nghĩa trong mô đun CosConcurencyControl như sau:

#include <CosTransactions.idl>

module CosConcurrencyControl {

enum lock_mode {read, write, upgrade, intention_read,

intention_write};

exception LockNotHeld{};

interface LockCoordinator

{

void drop_locks();

};

interface LockSet

{

void lock(in lock_mode mode);

boolean try_lock(in lock_mode mode);

void unlock(in lock_mode mode)

raises(LockNotHeld);

void change_mode(in lock_mode held_mode,

in lock_mode new_mode)

raises(LockNotHeld);

LockCoordinator get_coordinator(

in CosTransactions::Coordinator which);

};

interface TransactionalLockSet

{

void lock(in CosTransactions::Coordinator current,

in lock_mode mode);

boolean try_lock(in CosTransactions::Coordinator current,

in lock_mode mode);

void unlock(in CosTransactions::Coordinator current,

in lock_mode mode)

raises(LockNotHeld);

void change_mode(in CosTransactions::Coordinator current,

in lock_mode held_mode,

in lock_mode new_mode)

raises(LockNotHeld);

LockCoordinator get_coordinator(

in CosTransactions::Coordinator which);

};

interface LockSetFactory

{

LockSet create();

LockSet create_related(in LockSet which);

TransactionalLockSet create_transactional();

TransactionalLockSet create_transactional_related(in

TransactionalLockSet which);

};

};

Dịch vụ thể hiện đối tượng định nghĩa các giao thức và các qui ước để xuất/tiếp nhận các đối tượng, các đối tượng có thể được thể hiện dưới dạng các dòng bit trong bộ nhớ, trên đĩa hoặc luân chuyển trên mạng. Dạng thể hiện của đối tượng có thể tồn tại trong khoảng thời gian không hạn chế và được chuyển bằng bất kỳ phương tiện nào không thuộc môi trường ORB. Trong thực tế, máy khách thường yêu cầu dữ liệu được lưu trong  tập tin sử dụng dạng đã được chuẩn hoá, vì vậy có thể ứng dụng dịch vụ này để thực hiện chức năng trên. Các đối tượng phân tán thường được sử dụng để mô hình hoá thế giới thực, do đó chúng thường không tồn tại tách biệt mà ngược lại giữa các đối tượng phân tán đó luôn tồn tại các quan hệ. Dịch vụ quan hệ của các đối tượng (Relationship Service) cho phép thể hiện quan hệ giữa các đối tượng nhằm mục đích giảm tính phức tạp trong việc quản lý các mối quan hệ.

Dịch vụ quản lý giao tác cung cấp các giao diện hỗ trợ khả năng trao đổi thông tin giữa các đối tượng CORBA, việc quản lý các giao dịch đóng vai trò quan trọng nhằm đảm bảo tính an toàn của hệ thống, điều này càng trở nên quan trọng hơn trong môi trường tương tranh. Dịch vụ truy vấn cho phép ứng dụng thực hiện các thao thác truy vấn trên các đối tượng CORBA, tương tự như truy vấn các bảng trong CSDL, tuy nhiên khái niệm truy vấn trong được mở rộng theo nghĩa có thể chọn/thêm/cập nhật/xoá tập các đối tượng. Dịch vụ cấp phép cho phép định nghĩa các chính sách để điều khiển việc sử dụng các dịch vụ, có ba loại chính sách sau:

-         Cấp phép theo thời gian: ngày bắt đầu, ngày hết hạn, khoảng thời gian hết hạn sử dụng dịch vụ.

-         Cấp phép dựa trên số liệu thưc tế, ví dụ số liệu thực về việc sử dụng tài nguyên, số người đồng thời sử dụng dịch vụ

-         Cấp phép riêng cho từng người sử dụng

Dịch vụ quyền sở hữu cho phép các đối tượng xác định tập các tài sản thuộc quyền sở hữu theo từng cặp tên/giá trị, khái niệm tài sản được hiểu là các giá trị đã xác định gắn với các đối tượng theo phương pháp động. Dịch vụ thời gian  cho phép người sử dụng có thể tạo ra các sự kiện dựa trên việc đặt thời gian. Hiện nay mỗi hệ thống sử dụng cách thể hiện thời gian khác nhau, kiến trúc CORBA lựa chọn cách thể hiện thời gian quốc tế UTC. Dịch vụ bảo mật qui định giao diện cho các thuộc tính bảo mật:

-         Định danh và uỷ quyền: Kiểm tra người sử dụng

-         Uỷ quyền và kiểm soát truy nhập: Xác định người sử dụng nào được phép truy nhập tới các đối tượng dịch vụ nào

-         Lưu vết: Ghi lại các thao tác của người sử dụng

-         Bảo mật truyền tin: bao gồm việc uỷ quyền người sử dụng đến các dịch vụ, bảo vệ độ tính hợp và độ tin cậy.

-         Không thừa nhận: cung cấp các tính năng bảo mật tương tự như chữ ký điện tử

-         Quản lý các chính sách bảo mật

Giống như dịch vụ đặt tên, dịch vụ giới thiệu đối tượng cho phép một đối tượng khác có thể  xác định các đối tượng CORBA. Thay vì sử dụng tên, đối tượng máy khách tìm các dịch vụ dựa trên tên của thao tác, các tham số và các kiểu giá trị trả về. Như vậy sự khác nhau cơ bản giữa dịch vụ này và dịch vụ đặt tên là ở chỗ dịch vụ đặt tên tìm kiếm dịch vụ của đối tượng khi biết chính xác tên của đối tượng trong khi đó  dịch vụ  giới thiệu đối tượng xác định dịch vụ dựa trên vị trí/chức năng/tên của dịch vụ. Dịch vụ tập hợp hỗ trợ việc nhóm các đối tượng hoặc hỗ trợ các thao tác thực hiện trên nhóm các đối tượng. Tập hợp, ngăn xếp, hàng đợi.... đều là những tập hợp, nhiệm vụ của dịch vụ tập hợp là cung cấp một phương pháp thống nhất để tạo lập và thao tác với tập các đối tượng chung nhất. 

10.3.2                     Corba và các yêu cầu phần mềm trung gian

Kiến trúc CORBA tuân thủ các yêu cầu của phần mềm trung gian đã nêu trong chương 1, điều này được thể hiện trong các khía cạnh về định nghĩa giao diện, xác định đối tượng và cơ chế gọi các thao tác trên đối tượng phục vụ.

10.3.2.1 Ngôn ngữ định nghĩa giao diện

Kiến trúc CORBA sử dụng ngôn ngữ định nghĩa giao diện IDL để mô tả giao diện của các đối tượng. IDL là ngôn ngữ mô tả phục vụ cho mô hình lập trình hướng đối tượng, do đó hoàn toàn có khả năng sử dụng các tính chất kế thừa và đa hình trong ngôn ngữ lập trình hướng đối tượng. Mục tiêu của ngôn ngữ IDL là mô tả giao diện của các đối tượng, do đó độc lập với ngôn ngữ lập trình và có thể sử dụng các chương trình dịch để biên dịch sang các ngôn ngữ lập trình theo yêu cầu. Ngôn ngữ IDL định nghĩa các loại đối tượng bằng cách xác định các giao diện của chúng, mỗi giao diện bao gồm các hàm và các tham số của hàm. Mã lện thực hiện của các hàm nằm ngoài phạm vi định nghĩa của ngôn ngữ này, như vậy nó chỉ thể hiện các thao tác phục vụ cho máy khách.

10.3.2.2 Xác định địa chỉ đối tượng phục vụ

Để truy nhập các đối tượng từ xa, ứng dụng máy khách cần có địa chỉ của đối tượng phục vụ, thông tin này chứa trong bảng tham chiếu đối tượng. Vấn đề tham chiếu đối tượng đã được chuẩn hoá trong đặc tả CORBA 2.0 nhằm mục đích cho phép các ứng dụng phân tán có thể chạy trên môi trường ORB của các hãng khác nhau.

10.3.2.3 Gọi đối tượng phục vụ

Khi đã xác định được giao diện và địa chỉ của đối tượng phục vụ, có thể gọi các thao tác từ xa, quá trình này tuân thủ các bước thực hiện của phần mềm trung gian. Bắt đầu từ việc biên dịch tập tin mô tả giao diện viết trên ngôn ngữ IDL sẽ nhận được Máy trạm stub và Máy chủ skeleton.  Yêu cầu của ứng dụng máy khách được chuyển đến đối tượng phục vụ thông qua môi trường ORB, quá trình này hoàn toàn trong suốt đối với người phát triển.

10.3.3                     Áp dụng CORBA trong xây dựng ứng dụng phân tán

Để xây dựng phần mềm của hệ thống phân tán theo kiến trúc CORBA cần phải xác định các đối tượng Máy chủ và các đối tượng Máy trạm  của hệ thống.

10.3.3.1 Xây dựng ứng dụng trên máy chủ

            Trước hết cần phải định nghĩa các giao diện máy chủ, nghĩa là các dịch vụ máy chủ cung cấp và hương pháp truy nhập các dịch vụ đó dưới dạng tập tin .idl, sau đó sử dụng trình IDL để biên dịch tập tin .idl bằng ra ngôn ngữ lập trình phù hợp, kết quả sẽ nhận được Stub cho máy khách và Skeleton cho máy chủ. Bước tiếp theo là viết mã nguồn thể hiện các giao diện máy chủ cung cấp dựa trên Skeleton và cuối cùng viết chương trình chính cho máy chủ với cấu trúc cơ bản của hàm main() như sau:

-         Khởi tạo ORB và BOA/POA.

-         Tạo các đối tượng máy chủ.

-         Thông báo cho BOA/POA biết đối tượng máy chủ đã sẵn sàng

-         Chờ sự kiện CORBA, thực hiện và kết thúc

10.3.3.2 Xây dựng ứng dụng máy khách

Sử dụng Stub đã được tạo trong bước  trên để tạo tập tin cài đặt các tính năng của máy khách sau đó viết chương trình chính cho máy khách với khung hàm main() như sau:

-         Khởi tạo ORB và BOA/POA.

-         Tạo các đối tượng máy khách

-         Thông báo cho BOA /POA biết đối tượng máy khách đã sẵn sàng

-         Thực hiện các tác vụ  như xác định các đối tượng máy chủ...

10.4  Gọi phương thức từ xa trong Java

Gọi phương thức từ xa (Java RMI) thực chất là việc áp dụng phương pháp gọi thủ tục từ xa trong ngôn ngữ lập trình Java. Java RMI cho phép một đối tượng chạy trên một máy ảo Java này có thể kích hoạt một phương thức của một đối tượng đang chạy trên một máy ảo Java khác. Đối tượng có phương thức được gọi từ xa gọi là các đối tượng ở xa, một ứng dụng RMI bao gồm chương trình máy chủ và một chương trình máy khách.  Chương trình máy chủ tạo một số các đối tượng ở xa, tạo các tham chiếu đến chúng và chờ những chương trình máy khách kích hoạt các phương thức của các đối tượng từ xa này.  Chương trình máy khách lấy một tham chiếu đến một hoặc nhiều đối tượng từ xa trên máy chủ và kích hoạt các phương thức từ xa thông qua các tham chiếu. Một chương trình máy khách có thể kích hoạt các phương thức ở xa trên một hay nhiều máy chủ, nghĩa là việc thực thi của chương trình được trải rộng trên nhiều máy tính. Đây chính là đặc điểm của các ứng dụng phân tán, RMI là cơ chế để xây dựng các ứng dụng phân tán bằng ngôn ngữ Java.

10.4.1                    Mô hình khách/chủ

Mô hình khách/chủ dựa trên RMI bao gồm máy chủ là chương trình cung cấp các đối tượng có thể được gọi từ xa và máy khách là chương trình tham chiếu đến các phương thức của các đối tượng ở xa trên máy chủ. Stub chứa các tham chiếu đến các phương thức ở xa trên máy chủ, trong khi đó Skeleton đón nhận các tham chiếu từ Stub để kích hoạt phương thức tương ứng trên máy chủ. Thành phần tham chiếu từ xa là  đóng vai trò truyền thông của RMI.

10.4.2                    Các cơ chế liên quan

Cơ chế định vị đối tượng từ xa: Cơ chế này xác định cách thức mà chương trình Máy khách có thể lấy được tham chiếu đến các đối tượng từ xa. Thông thường người ta sử dụng dịch vụ đặt tên lưu giữ các tham chiếu đến các đối tượng cho phép gọi từ xa mà máy khách sau đó có thể tìm kiếm.

Cơ chế giao tiếp với các đối tượng từ xa: Chi tiết của cơ chế giao tiếp với các đối tượng ở xa được cài đặt bởi hệ thống RMI.

Tải các lớp dạng bytecodes cho các lớp mà nó được chuyển tải qua lại giữa máy ảo: Vì RMI cho phép các chương trình gọi phương thức từ xa trao đổi  các đối tượng  với  các phương thức ở xa dưới dạng các tham số hay giá trị trả về của phương thức nên RMI cần có cơ chế cần thiết để tải mã Bytecodes của các đối tượng từ máy ảo này sang máy ảo khác. Tiến trình vận hành của một ứng dụng khách/chủ theo kiểu RMI gồm các bước sau:

-         Máy chủ tạo ra các đối tượng cho phép gọi từ xa cùng với các Stub và Skeleton của chúng.

-         Máy chủ sử dụng lớp đặt tên để đăng ký tên cho một đối tượng từ xa. 

-         Lớp đặt tên đăng ký Stub của đối tượng từ xa với Registry Máy chủ.

-         Thành phần đăng ký (Registry) máy chủ sẵn sàng cung cấp tham thảo đến đối tượng từ xa khi có yêu cầu.

-         Máy khách yêu cầu định vị đối tượng xa qua tên đã được đăng ký với dịch vụ tên.

-         Bộ phận quản lý tên tải Stub của đối tượng xa từ dịch vụ tên mà đối tượng xa đã đăng ký về Máy khách.

-         Cài đặt đối tượng Stub và trả về tham khảo đối tượng xa cho Máy khách.

-         Máy khách thực thi một lời gọi phương thức xa thông qua đối tượng Stub. 

10.4.3                    Các lớp hỗ trợ

Java hỗ trợ các lớp cần thiết để cài đặt các ứng dụng khách/chủ dựa trên RMI trong các gói: java.rmi, trong số đó các lớp thường được dùng sau:

java.rmi.Naming

java.rmi.RMISecurityManager

java.rmi.RemoteException;

java.rmi.máy chủ.RemoteObject

java.rmi.máy chủ.RemoteMáy chủ

java.rmi. máy chủ.UnicastRemoteObject

10.4.4                    Xây dựng một ứng dụng phân tán với RMI

Xây dụng một ứng dụng phân tán bằng cơ chế RMI gồm các bước sau: 

-         Thiết kế và cài đặt các thành phần của ứng dụng.

-         Biên dịch các chương trình nguồn và tạo ra Stub và Skeleton.

-         Tạo các lớp có thể truy xuất từ mạng.

-         Thực thi ứng dụng

10.4.4.1 Thiết kế và cài đặt các thành phần của ứng dụng

Định nghĩa các giao diện từ xa: Một giao diện ở xa mô tả các phương thức mà nó có thể được kích hoạt từ xa bởi các máy khách. Đi cùng với việc định nghĩa giao diện từ xa là việc xác định các lớp cục bộ làm tham số hay giá trị trả về của các phương thức được gọi từ xa.

Cài đặt các đối tượng từ xa: Các đối tượng ở xa phải cài đặt cho một hoặc nhiều giao diện từ đã được định nghĩa. Các lớp của  đối tượng từ xa cài đặt cho các phương thức được gọi từ xa đã được khai báo trong giao diện ở xa và có thể định nghĩa và cài đặt cho cả các phương thức được sử dụng cục bộ. Nếu có các lớp làm đối số hay giá trị trả về cho các phương thức được gọi từ xa thì ta cũng định nghĩa và cài đặt chúng.

Cài đặt các chương trình máy khách: Các chương trình máy khách có sử dụng các đối tượng ở xa có thể được cài đặt ở bất kỳ thời điểm nào sau khi các giao diện ở xa đã được định nghĩa.

10.4.4.2 Biên dịch các tập tin nguồn và tạo Stubs và Skeleton

Giai đoạn này gồm hai bước:

-         Dùng chương trình biên dịch javac để biên dịch các tập tin nguồn như các giao diện ở xa, các lớp cài đặt cho các giao diện ở xa, lớp máy chủ, lớp máy khách và các lớp liên quan khác.

-         Dùng trình biện dịch rmic để tạo ra stub và skeleton cho các đối tượng từ xa từ các lớp cài đặt cho các giao diện ở xa.

10.4.4.3 Tạo các lớp có thể truy xuất từ mạng

Tạo một tập tin chứa tất cả các tập tin có liên quan như các giao diện ở xa stub, các lớp hỗ trợ mà chúng cần thiết phải tải về Máy khách  và làm cho tập tin này có thể truy cập đến thông qua một máy chủ.

10.4.4.4 Thực thi ứng dụng

Thực thi ứng dụng bao gồm việc thực thi đăng ký RMI trên máy chủ, thực thi máy chủ, và thực thi máy khách, các công việc bao gồm:

-         Tạo giao diện khai báo các phương thức được gọi từ xa của đối tượng.

-         Tạo lớp cài đặt cho giao diện đã được khai báo.

-         Viết chương trình máy chủ.

-         Viết chương trình máy khách.

-         Dịch các tập tin nguồn theo dạng RMI để tạo ra các lớp tương ứng và stub cho máy khách, skeleton cho máy chủ.

-         Khởi động dịch vụ đăng ký.

-         Thực hiện chương trình máy chủ.

-         Thực thi chương trình máy khách.

10.5  Dịch vụ web

Dịch vụ web là một mô hình phát triển dựa trên nền tảng công nghệ web, nó bao gồm tập các chuẩn cho phép các xây dựng các ứng dụng phân tán mà không phụ thuộc nền tảng hệ thống. Dịch vụ web sử dụng các giao thức mở và bên trong tự chứa các đặc tả dữ liệu theo chuẩn XML, đó là ngôn ngữ mô tả dữ liệu để trao đổi giữa các hệ thống. Tốc độ trao đổi thông tin dựa trên dịch vụ web thường không cao, tuy nhiên việc phát triển các ứng dụng này tương đối đơn giản, rút ngắn thời gian phát triển phần mềm. Dịch vụ web liên lạc với máy khách thông qua các thông điệp XML được chuyển qua mạng nhờ các giao thức của tầng ứng dụng như HTTP, FTP, SMPP…, do đó các ứng dụng có thể truy nhập dịch vụ web để trao đổi thông tin một cách dễ dàng. Các ứng dụng dịch vụ web có thể được viết bằng nhiều loại ngôn ngữ lập trình khác nhau như Java, C#.... và có thể dễ dàng mở rộng hoặc nâng cấp. Để tạo ra ứng dụng lớn với nhiều đơn vị tham gia, ứng dụng này sẽ được chia thành những thành phần nhỏ hay dịch vụ chia sẻ đặt tại các máy chủ khác nhau, chúng được đóng gói và giao dịch qua mạng sử dụng các giao thức chuẩn của tầng ứng dụng. Ưu điểm của các giao thức chuẩn là có thể được truy cập một cách dễ dàng qua môi trường Internet, khắc phục được tính đóng của các công nghệ phân tán khác.

10.5.1                    Các thành phần trong kiến trúc dịch vụ Web

Nền tảng của dịch vụ web là XML và HTTP, XML là ngôn ngữ mô tả dữ liệu dùng để trao đổi thông tin giữa các  hệ thống có nền tảng và ngôn ngữ lập trình khác nhau, HTTP là giao thức phổ biến được sử dụng nhiều nhất trên mạng Internet. Các thành phần dịch vụ của dịch vụ web bao gồm:

-         SOAP (Simple Object Access Protocol) là giao thức dựa trên ngôn ngữ XML, được dùng để cho các ứng dụng trao đổi thông tin qua giao thức HTTP.

-         UDDI (Universal Description Discovery and Integration) là dịch vụ thư mục, nơi các ứng dụng có thể đăng ký hay tìm kiếm dịch vụ.

-         WSDL (Web Services Description Language) là ngôn ngữ dựa trên ngôn ngữ XML, dùng để xác định các mô tả trong dịch vụ web.

10.5.2                    Trao đổi thông tin của dịch vụ Web

Dịch vụ web gồm ba thành phần chính, đó là thành phần cung cấp dịch vụ, thành phần sử dụng dịch vụ và môi trường dịch vụ. Thành phần cung cấp dịch vụ  công bố sự hiện diện của dịch vụ web cho môi trường dịch vụ, bên yêu cầu dịch vụ tìm kiếm và yêu cầu thông tin dịch vụ tại môi trường này. Khi tìm thấy thông tin yêu cầu, phía máy khách sẽ nhúng dịch vụ web vào ứng dụng, quy trình tạo một dịch vụ web gồm các giai đoạn sau:

-         Bên cung cấp dịch vụ tạo ra một dịch vụ web, sử dụng WSDL để mô tả.

-         Bên cung cấp dịch vụ đăng kí dịch vụ.

-         Ứng dụng khách xác định và yêu cầu dịch vụ đã được đăng kí bằng cách truy vấn UDDI, nếu tìm thấy thì nhúng dịch vụ vào ứng dụng.

-         Dữ liệu được trao đổi dưới dạng XML trên nền giao thức HTTP.

10.5.2.1 Giao thức SOAP

Giao thức truy nhập đối tượng đơn giản (Simple Object Access Protocol) là một giao thức truyền thông giữa các ứng dụng qua môi trường Internet, nó định dạng thông điệp trao đổi dựa trên ngôn ngữ XML và giao thức HTTP. XML định dạng dữ liệu dưới dạng văn bản, do đó có thể dễ dàng đi qua tường lửa, giao thức SOAP đơn giản vì có khả năng mở rộng và độc lập với ngôn ngữ lập trình cũng như nền tảng hệ thống. Giao thức SOAP mô tả rõ định dạng của thông điệp yêu cầu và trả lời dùng trong việc gửi và nhận thông tin thông qua giao thức HTTP nhờ phương thức POST.  Về cú pháp, thông điệp SOAP bao gồm:

-         Envelope: Phần bắt buộc phải có, định dạng văn bản XML của thông điệp SOAP.

-         Header: Có thể bỏ qua, chứa các thông tin điều khiển.

-         Body: Phần bắt buộc phải có, chứa thông tin gọi và trả lời.

-         Fault: chứa thông tin trạng thái và lỗi.

Giao thức SOAP hỗ trợ hai kiểu truyền thông khác nhau:

-         Gọi thủ tục từ xa: cho phép gọi hàm hoặc thủ tục qua mạng, nhiều dịch vụ web sử dụng kiểu này vì có thêm nhiều trợ giúp.

-         Văn bản: đư­ợc viết nh­ư kiểu hư­ớng thông điệp, nó cung cấp tầng thấp trừu tư­ợng và  yêu cầu lập trình viên phải mô tả dữ liệu cũng như phương thức sẽ gọi để thực hiện yêu cầu.

Các định dạng thông điệp, tham số và lời gọi đến các hàm giao diện lập trình ứng dụng trong hai kiểu trên khác nhau, do đó việc quyết định chọn cái nào tùy thuộc vào thời gian và đặc điểm của dịch vụ cần xây dựng.

10.5.2.2 Ngôn ngữ WSDL

Ngôn ngữ mô tả dịch vụ web (Web Services Description Language) là ngôn ngữ mô tả giao tiếp và thực thi dựa trên thông điệp định dạng XML, WSDL dùng để mô tả và xác định dịch vụ web, nó cho biết dịch vụ web cung cấp chức năng gì và được đặt tại đâu, cách thức truy nhập và gọi phương thức cung cấp dịch vụ. Cấu trúc WSDL gồm 4 thành phần:

-         Type: Định nghĩa những kiểu dữ liệu  dịch vụ web sử dụng.

-         Message: Định nghĩa thành phần dữ liệu của một phương thức

-         PortType: là thành phần quan trọng nhất của dịch vụ web, nó mô tả các phương thức có thể được thực hiện và các thông điệp liên quan.

-         Binding: định nghĩa khuôn dạng thông điệp và chi tiết giao thức cho mỗi cổng.

10.5.2.3 Thư mục UDDI

Thư mục UDDI (Universal Description, Discovery and Integration) sử dụng ngôn ngữ XML và các giao thức HTTP, DNS và truyền thông qua SOAP để thực hiện vai trò trung gian trong quá trình trao đổi thông tin của các dịch vụ web, nó là một thư mục dùng để lưu thông tin của mọi dịch vụ web. Giao diện của thư mục này được mô tả bằng ngôn ngữ WSDL, thư mục UDDI bao gồm ba thành phần:

-         Trang trắng: Mô tả thông tin nghiệp vụ và đóng vai trò xuất bản, nghĩa là chứa thông tin đăng ký dịch vụ của các nhà cung cấp, bao gồm các thông tin nghiệp vụ như  tên, mô tả nghiệp vụ, thông tin liên hệ …

-         Trang vàng: Bao gồm các thông tin mô tả đối tượng nghiệp vụ, nó chứa các thông tin cần thiết để một ứng dụng có thể tìm thấy một dịch vụ web cụ thể. Một nghiệp vụ có thể cung cấp nhiều dịch vụ, do đó  mỗi trang trắng có thể gồm nhiều trang vàng.

-         Trang xanh: Chứa các thông tin ràng buộc, mô tả cách một ứng dụng kết nối và tương tác với dịch vụ web sau khi tìm thấy, thông tin bao gồm đường dẫn, tên phương thức, kiểu tham số … của dịch vụ web.

Danh sách các dịch vụ web được mô tả bằng ngôn ngữ WSDL sẽ được gửi tới UDDI để đăng ký, tại đây sẽ ánh xạ danh sách dịch vụ thành bản ghi UDDI định dạng XML, bản ghi đăng ký UDDI bao gồm trang trắng, trang vàng và trang xanh.

10.5.3                    Quy trình xây dựng ứng dụng dịch vụ Web

Để xây dựng một ứng dụng phân tán dựa trên dịch vụ Web cần thực hiện các bước sau:

-         Định nghĩa và xây dựng các chức năng mà dịch vụ sẽ cung cấp.

-         Tạo WSDL cho dịch vụ, chuyển đổi thông tin giữa máy chủ và WSDL.

-         Xây dựng SOAP trên máy chủ.

-         Đăng ký WSDL với UDDI để cho phép các máy khách có thể tìm thấy và truy nhập.

-         Lập trình viên cho ứng dụng máy khách nhận tập tin định dạng WSDL và từ đó dựng SOAP cho máy khách để có thể kết nối với SOAP trên máy chủ.

-         Xây dựng ứng dụng phía khách, sau đó gọi dịch vụ thông qua việc kết nối đến máy chủ cung cấp dịch vụ web.

10.6  Kiến trúc hướng dịch vụ

Sự phát triển nhanh chóng của công nghệ làm nảy sinh môi trường giao tiếp không đồng nhất giữa các thành phần trong hệ thống phân tán. Một vấn đề đặt ra đối với các tổ chức công nghệ thông tin là làm sao xây dựng được một kiến trúc phần mềm có khả năng  tích hợp và sử dụng các thành phần mới nhằm giảm thiểu chi phí phát triển và bảo trì hệ thống phần mềm. Chúng ta đã có các kiến trúc hướng đối tượng phân tán, tuy nhiên các kiến trúc này đều có đặc tính ràng buộc chặt chẽ giữa các thành phần với nhau làm cho các kiến trúc này chưa thật hiệu quả. Kiến trúc hướng dịch vụ ra đời gần nhằm mục đích quyết những vấn đề khó khăn trong giao tiếp giữa các thành phần của hệ thống phân tán.

10.6.1                    Giới thiệu về kiến trúc hướng dịch vụ

Kiến trúc hướng dịch vụ (SOA: Service Oriented Architectural)  là một cách tiếp cận tổ chức hệ thống thông tin sao cho có thể truy nhập các tài nguyên thông qua các giao diện và thông điệp. SOA dùng trong các chuẩn mở để biểu diễn các  dịch vụ thông qua các giao diện đã được chuẩn hóa, từng thành phần riêng lẻ sẽ trở thành những khối cơ bản để có thể tái sử dụng trong các ứng dụng khác, vì vậy kiến trúc này được sử dụng để tích hợp các ứng dụng. Dịch vụ là các hàm chức năng thực hiện theo quy trình nghiệp vụ nào đó, chúng có thể dễ dàng tìm thầy và liên thông với nhau, tuy nhiên mức độ gắn kết không cao. Mỗi dịch vụ bao gồm nhiều thành phần và được đóng gói  ở mức cáo, người sử dụng không cần biết vị trí của chúng. SOA bao gồm các dịch vụ kết nối mềm dẻo với nhau, mỗi dịch vụ có giao diện được định nghĩa rõ ràng và độc lập với nền tảng của hệ thống và có thể tái sử dụng. SOA là cấp độ cao hơn của sự phát triển ứng dụng, chú trọng đến quy trình nghiệp vụ và dùng giao diện chuẩn để che giấu sự phức tạp bên trong.

Thiết kế SOA tách riêng phần thực hiện dịch vụ với giao diện gọi dịch vụ, điều này tạo nên một giao diện nhất quán cho ứng dụng sử dụng dịch vụ mà không cần quan tâm tới công nghệ thực hiện dịch vụ. Thay vì xây dựng các ứng dụng đơn lẻ và đồ sộ, nhà phát triển sẽ xây dựng các dịch vụ tinh gọn hơn có thể triển khai và tái tạo sử dụng trong toàn bộ quy trình nghiệp vụ. Điều này cho phép tái sử dụng phần mềm tốt hơn, cũng như tăng sự mềm dẻo vì các nhà phát triển có thể cải tiến dịch vụ mà không làm ảnh hưởng đến ứng dụng sử dụng dịch vụ. SOA không hoàn toàn mới, DCOM và CORBA cũng có kiến trúc tương tự, tuy nhiên các kiến trúc cũ ràng buộc các thành phần với nhau quá chặt ví dụ như các ứng dụng phân tán muốn làm việc với nhau phải được thoả thuận về chi tiết tập hàm giao diện lập trình ứng dụng, một thay đổi mã lệnh trong thành phần DCOM sẽ yêu cầu những thay đổi tương ứng đối với mã lệnh truy cập thành phần này. Ưu điểm lớn nhất của SOA là khả năng kết nối mềm dẻo và tái sử dụng, các dịch vụ có thể được sử dụng trên mọi nền tảng và được viết bằng bất kỳ ngôn ngữ lập trình nào. SOA dựa trên hai nguyên tắc thiết kế quan trọng, đó là tính  mô đun và đóng gói, tính mô đun tách vấn đề lớn thành nhiều vấn đề nhỏ để thuận lợi cho việc xử lý, đóng gói là tính năng che giấu dữ liệu và  nghiệp vụ bên trong đối với người sử dụng bên ngoài. Dịch vụ được thiết kế phù hợp với SOA cần phải được đóng gói cao ở mức độ cao và có thể dễ dàng tái sử dụng, việc cài đặt đảm bảo tính độc lập và trong suốt về vị trí.

 

10.6.2                    Các dịch vụ

Theo nghĩa thông thường, dịch vụ là hoạt động công việc của người này phục vụ  người khác, trong kỹ thuật khái niệm dịch vụ được hiểu là chức năng tiếp nhận các yêu cầu và trả về kết quả thông qua giao diện chuẩn đã qui định. Kiến trúc hướng dịch vụ tập trung vào qui trình nghiệp vụ trên các hệ thống khác nhau, mục tiêu cơ bản của dịch vụ là thể hiện tính năng tương ứng với hoạt động thương mại thực tế. Kiến trúc hướng dịch vụ phân rã các chức năng của hệ thống thành các dịch vụ, mỗi dịch vụ lại được phân rã thành các dịch vụ nhỏ hơn… Có thể nói dịch vụ là nhân tố chủ yếu hình thành nên SOA, nói cách khác kiến trúc SOA lấy dịch vụ làm trọng tâm để xây dựng các ứng dụng. Từ các quy trình, chính sách, nguyên lý hay phương pháp hiện thực trong SOA đều hướng đến khái niệm dịch vụ. Các công cụ được lựa chọn bởi SOA hướng đến việc tạo và triển khai các dịch vụ, ngay cả cơ sở hạ tầng thực thi được cung cấp bởi SOA cũng hướng đến việc thực thi và quản lý các dịch vụ.

Hình 10.11 Kiến trúc hướng dịch vụ

 

Về mặt kỹ thuật, dịch vụ là những sản phẩm phần mềm được định nghĩa một cách rõ ràng thông qua các giao diện. Với góc nhìn của doanh nghiệp, dịch vụ được gắn với một chức năng thực tiễn mà nó đảm nhận trong hệ thống. Mỗi dịch vụ thường kèm theo những chính sách sử dụng như: quyền truy xuất, thời gian truy xuất, mức độ bảo mật, chi phí sử dụng dịch vụ… Dịch vụ kỹ thuật tái sử dụng định nghĩa các dịch vụ chỉ phục vụ cho mục đích nghiệp vụ và được tái sử dụng trong nhiều dòng dịch vụ khác nhau. Các dịch vụ thuộc loại này có thể tính đến dịch vụ truy xuất dữ liệu, đăng nhập, quản lý người dùng.

Phương châm dịch vụ kinh doanh là tập hợp các dịch vụ hỗ trợ cho nghiệp vụ nhằm mục đích phục vụ trực tiếp hay gián tiếp cho khách hàng thông qua hệ thống tự động. Các kênh dịch vụ kinh doanh thường được định nghĩa thành miền dịch vụ  như tài chính, bán hàng, quảng cáo, sản xuất, vận chuyển, kỹ thuật, quản lý lợi nhuận, chăm sóc khách hàng…. Tất cả các dịch vụ trong miền dịch vụ nên có sự kết nối với nhau thông qua một từ điển dữ liệu chung để có thể dễ dàng vận hành trong hệ thống. Các dịch vụ trong những miền dịch vụ khác nhau có thể không đồng nhất về từ điển dữ liệu, do đó cần có các chính sách truyền dữ liệu khi có yêu cầu đồng bộ dữ liệu giữa các miền dịch vụ.

Hợp đồng dịch vụ  là giao diện giữa dịch vụ nghiệp vụ và dịch vụ kỹ thuật nhằm che giấu những thể hiện chi tiết của dịch vụ kỹ thuật. Nền tảng dịch vụ Web gồm các chuẩn và phương tiện giúp các dịch vụ có thể giao tiếp với nhau một cách độc lập với công nghệ. Các quy trình và chính sách hướng dẫn của SOA  bao gồm các chỉ dẫn cho sự phối hợp của các dịch vụ nhằm đạt mức lợi nhuận cao nhất cho doanh nghiệp. Các phương pháp và công cụ là các công cụ SOA sẽ dùng trong quá trình quản lý dự án, mô hình dịch vụ, mô hình dữ liệu, quản lý và phát triển hệ thống. Các nguyên lý và chỉ dẫn bao gồm các nguyên lý giúp cho các nhà kiến trúc và các nhà phát triển trong quá trình xác định các dịch vụ kỹ thuật và dịch vụ nghiệp vụ.

Dịch vụ là khái niệm chính trong kiến trúc hướng dịch vụ, mỗi dịch vụ được định nghĩa bởi một hợp đồng dịch vụ phân biệt rõ ràng giữa chức năng và hiện thực. Các dịch vụ chỉ nên giao tiếp với các dịch vụ khác thông qua những giao diện được định nghĩa một các rõ ràng. Dịch vụ có thể được truy xuất thông qua những chuẩn dùng trong môi trường giao tiếp rộng như SOAP,WSDL, XML, HTTP, UDDI… và không nên có ràng buộc quá chặt chẽ. Mỗi dịch vụ nên thực hiện những tác vụ rời rạc và cung cấp giao diện đơn giản khi truy xuất nhằm khuyến khích việc tái sử dụng chúng cho các hệ thống về sau. Các dịch vụ nên cung cấp các siêu dữ liệu định nghĩa các ràng buộc cũng như chức năng của chúng. SOA lấy dịch vụ làm trọng tâm, do đó cần cung cấp các công cụ giúp mô hình hóa, phát triển, triển khai, liên kết, quản lý và kiểm tra độ bảo mật của các dịch vụ, đó là các sản phẩm, công nghệ và tiện ích đã được phê chuẩn.

10.6.3  Mô hình cặp lỏng

Khái niệm gắn kết ám chỉ đến mt số điều kiện ràng buc gia các thành phần vi nhau, chúng có thể là những điều kiện chặt hoặc lỏng, thậm chí có những ràng buộc không hề được biết trước. Hu hết mi kiến trúc phn mm đều hướng đến tính ràng buộc lỏng giữa các thành phần và gọi là mô hình cặp lỏng. Mc độ gắn kết ca mi hthng nh hưởng trc tiếp đến khnăng chnh sa hthng, gắn kết càng cht thì càng ảnh hưởng đến phía sdng dch vmi khi có thay đổi nào đó xy ra. Mc độ gắn kết tăng dn khi khi bên sdng dch vbiết nhiu thông tin ngm định ca bên cung cp dch v. Ngược li, nếu bên sdng dch vbiết ít thông tin chi tiết bên trong dch vtrước khi gi nó thì quan hgia hai bên càng lỏng. SOA htrgắn kết lỏng thông qua vic sdng hp đồng và nhúng, người dùng truy vn đến nơi lưu trvà cung cp thông tin dch v để ly thông tin, một thành phần trong hệ thống cung cấp dịch vụ truy vấn strvtt cnhng dch vthỏa mãn tiêu chun tìm kiếm, từ đó người dùng chvic chn dch vụ cần thiết và thc thi phương thc trên đó theo mô tdch v. Bên sdng dch vkhông cn phthuc trc tiếp vào cài đặt ca dch vmà chỉ dựa trên hp đồng mà dch vụ đó htr. Mô hình cặp lỏng giúp gỡ bỏ những ràng buộc điều khiển giữa những thành phần đầu cuối, mỗi thành phần trong hệ thống phân tán có thể tự quản lý độc lập nhằm tăng hiệu suất, khả năng mở rộng và khả năng đáp ứng cao, những thay đổi trong cài đặt cũng được che giấu. Gắn kết lỏng đảm bảo tính độc lập giữa bên cung cấp và bên sử dụng nhưng nó đòi hỏi các giao diện phải theo chuẩn và cần một thành phần trung gian quản lý, trung chuyển yêu cầu giữa các thành phần đầu cuối.

10.6.4                    Chu kỳ sống dịch vụ

Dịch vụ là một phần của phần mềm trong hệ thống phân tán, do đó chu kỳ sống của dịch vụ cũng gần tương tự như chu kỳ sống của phần mềm, dịch vụ có thể ở giai đoạn phát triển hoặc đã đưa vào hoạt động sản xuất kinh doanh. Nếu ở giai đoạn phát triển cần phải chỉ ra được các tương tác dịch vụ và chỉ ra những dịch vụ cần thiết phải xây dựng, do đó dịch vụ ở giai đoạn này được hiểu là một phần xây dựng qui trình kinh doanh. Phần mềm đã được đưa vào hoạt động kinh doanh sẽ phát sinh ra nhiều vấn đề và yêu cầu mới cần phải chỉnh sửa hoặc nâng cấp, có một số dịch vụ sẽ được sửa trực tiếp trong khi hệ thống vẫn đang vận hành. Tuy nhiên, nhiều trường hợp phức tạp sẽ đòi hỏi phải tạm thời ngừng dịch vụ để tập trung cho việc sửa đổi và nâng cấp.

10.6.5                    Phân loại dịch vụ

Kiến trúc hướng dịch vụ chia các dịch vụ thành dịch vụ cơ bản, dịch vụ tích hợp và dịch vụ qui trình, ba loại này liên quan mật thiết đến quá trình cung cấp dịch vụ. Dịch vụ cơ bản cung cấp các tính năng kinh doanh cơ bản nhất, chúng chưa được phân cho các dịch vụ khác, thời gian chạy tương đối ngắn và thuộc loại không trạng thái, do đó các dịch vụ này rất phù hợp với phương thức gọi đồng bộ. Thực tế, các dịch vụ cơ bản thường được cài đặt để truy nhập dữ liệu và một số nghiệp vụ cơ bản  như tạo một người dùng mới hoặc thay đổi mật khẩu… Các dịch vụ tích hợp được cấu thành từ một số dịch vụ cơ bản, nhìn chung thời gian thực hiện của các dịch vụ này cũng tương đối ngắn và thuộc loại không trạng thái, sự tích hợp ở đây có thể thuộc về một hoặc nhiều nền tảng. Dịch vụ qui trình khác với hai loại trên, nó phản ánh một qui trình kinh doanh, do đó thời gian thực hiện khá dài và thuộc loại có trạng thái.

10.6.6                    Trục dịch vụ doanh nghiệp

Trục dịch vụ doanh nghiệp là hạ tầng kiến trúc cho phép sử dụng các dịch vụ của hệ thống sản xuất, thường triển khai các ứng dụng, các nền tảng và các quy trình nghiệp vụ. Các dịch vụ này được liên kết và trao đổi thông tin với nhau nhưng không sử dụng một loại định dạng dữ liệu chung và cũng  không có một chuẩn giao tiếp chung. Nếu cần giao tiếp với các hệ thống bên ngoài, vấn đề tích hợp sẽ mở rộng ra khỏi phạm vi của doanh nghiệp, nó bao chùm lên các hệ thống và quy trình nghiệp vụ của các doanh nghiệp khác nhau. Những năm gần đây, một số giải pháp như tích hợp ứng dụng doanh nghiệp, doanh nghiệp với doanh nghiệp, kiến trúc hướng dịch vụ và dịch vụ Web đã tập trung giải quyết những vấn đề liên quan tới tích hợp hệ thống thông tin của các doanh nghiệp. Những giải pháp trên tập trung vào một vài vấn đề về tích hợp, nhưng chúng thường là sản phẩm của một công ty nào đó, giá thành đắt và tốn thời gian triển khai.

Trục dịch vụ doanh nghiệp theo tiêu chuẩn sẽ giải quyết các vấn đề liên quan đến việc tích hợp mà không cần phải loại bỏ những giải pháp đang sử dụng. Mục đích của trục dịch vụ doanh nghiệp là làm cho việc tích hợp các ứng dụng và quy trình trở nên thuận tiện hơn bằng cách cung cấp một quy trình phân tán, điều hướng thông minh, bảo mật và có thể tự động chuyển đổi dữ liệu. Trong trục dịch vụ doanh nghiệp, những dịch vụ trên là những dịch vụ nền tảng do đó các ứng dụng không cần phải thi hành riêng biệt những yêu cầu trên theo một cách thức riêng biệt của chúng. Trục dịch vụ doanh nghiệp giải quyết những điểm yếu của những giải pháp có sẵn bằng cách tạo ra một nền tảng chuẩn cho việc tích hợp. Giải pháp điểm–điểm yêu cầu cứ n thành phần tham gia hệ thống thì phải có n-1 giao diện để có thể giao tiếp được với các thành phần còn lại được thay thế bằng giải pháp trục, mỗi thành phần chỉ cần một giao diện để giao tiếp với trục và như vậy sẽ giao tiếp với các thành phần còn lại. Trục dịch vụ doanh nghiệp đảm bảo giao tiếp phân tán, chuyển hướng, xử lý nghiệp vụ, ổn định và bảo mật, đồng thời cũng cung cấp các dịch vụ có khả năng cắm và chạy.

10.6.7                    Các mô hình dựa trên SOA

Các mô hình dựa trên SOA thoạt nhìn khá phức tạp, nó tùy thuộc vào góc nhìn đối với  hệ thống, có thể đó là góc độ kinh doanh hay kỹ thuật. Mô hình logic phân chia hệ thống thành các miền, mỗi miền đảm nhiệm vai trò và trách nhiệm riêng. Khái niệm miền ở đây phản ánh một thực thể nào đó, ví dụ đó là công ty, phòng/ban… Đứng trên góc độ kỹ thuật có thể thấy trục dịch vụ doanh nghiệp đóng vai trò trung tâm, các vùng chỉ cung cấp các dịch vụ cơ bản và dịch vụ tích hợp, các dịch vụ qui trình được tách biệt riêng rẽ.

10.6.8                    Các mẫu trao đổi thông điệp

So với kiến trúc dựa trên thành phần, điểm khác biệt chính của SOA là cung cấp khả năng giao tiếp giữa các dịch vụ sử dụng thông điệp dựa trên các giao thức phổ biến như HTTP, FTP, SMTP, .... và vì vậy kiến trúc SOA mới có khả năng độc lập với nền tảng. Các dịch vụ hoạt động trên nền tảng khác nhau vẫn có thể giao tiếp với nhau nhờ vào các giao diện đã được chuẩn hóa để cộng tác xử lý một tác vụ nào đó. Phương thức trao đổi thông điệp đã được tất cả các nền tảng và ngôn ngữ lập trình hỗ trợ, do đó các dịch vụ trên các nền tảng nào sẽ hoạt động với cấu trúc dữ liệu đặc thù của nền tảng đó. Trao đổi thông điệp có thể thực hiện theo cơ chế không đồng bộ, bên gửi và và bên nhận không cần phải chờ nhau, điều này giúp cho mỗi bên tiếp tục xử lý công việc sau khi gởi thông điệp mà không cần dừng thực thi để chờ thông điệp trả lời.


CHƯƠNG 11:               THỰC HÀNH

11.1    Truyền thông nhất thời

Mục đích: Nắm được cách thực hiện truyền thông nhất thời sử dụng các hàm nguyên thủy.

Nhiệm vụ 1: Chạy thử trên máy cục bộ

Vào cửa sổ command, gõ lệnh ipconfig /all để lấy địa chỉ Ip sau đó vào tập tin app.config sửa giá trị trên dòng

<add key="ServerIp" value="192.168.3.103"/>

Biên dịch sau đó vào thư mục \bin, chạy tập ứng dụng SocketServer

Biên dịch sau đó vào thư mục \bin, chạy tập ứng dụng SocketClient

Nhiệm vụ 2: Chạy thử trên 2 máy khác nhau

Nhiệm vụ 3 (mở rộng): Viết ứng dụng chat giữa 2 máy tính.

11.2    Viết ứng dụng dịch vụ web

Mục đích: Nắm được cách viết dịch vụ web trên máy chủ và cách máy khách gọi

Nhiệm vụ 1: Sử dụng tiện ích wsdl để tạo tập tin Client stub của dịch vụ web theo đường dẫn

http://103.3.252.222/DsWebServices/SampleWebServices.asmx

Bước 1: Tạo ứng dụng Client

 

Tạo thư mục Code trong Project

Tìm thư mục chứa tập tin wsdl.exe trong máy tính

(Thông thường trong thư mục C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin)

Vào cửa sổ command và thư mục chứa tập tin wsdl.exe và gõ lệnh sau:

wsdl http://103.3.252.222/DsWebServices/SampleWebServices.asmx

 

Tiện ích wsdl đã sinh tập tin SampleWebServices.cs, sao chép tập tin này vào thư mục code của ứng dụng máy khách.

Viết ứng dụng trên máy khách gọi các hàm của dịch vụ web.

Nhiệm vụ 1: Chạy thử phần mềm mẫu.

Nhiệm vụ 2: Tìm hiểu chương trình mẫu

Nhiệm vụ 3: Viết dịch vụ web và cài đặt trên máy cục bộ của học viên, viết ứng dụng máy khách.

Nhiệm vụ 4: Viết ứng dụng như sau:

Dịch vụ web 1 DestServices Hàm GetServerTime() trả về thời gian hiện hành

Dịch vụ web 2 MiddleServices Hàm GetServerTime (string UrlTo DestServices) gọi hàm GetServerTime() của dịch vụ web 1.

Ứng dụng Client: Gọi hàm  GetServerTime (UrlTo DestServices) của dịch vụ web 2.

11.3    Giao thức NTP

Mục đích: Nắm được giải thuật Cristian, biết chuyển đổi dữ liệu dạng kết thúc cao sang dạng kết thúc thấp.

Nhiệm vụ 1: Tìm hiểu chương trình mẫu và chạy thử.

Nhiệm vụ 2: Viết chương trình minh họa cho các giải thuật đồng bộ thời gian vật lý: Berkeley, giải thuật quảng bá, giải thuật trung bình

 

 

 

 

 

 

 

 


TÀI LIỆU THAM KHẢO

[1]

A. S. Tanenbaum, M. V. Steen, "Distributed Systems: Principles and Paradigms",  2nd Edition, Prentice-Hall, 2007.

[2]

G. Coulouris, J. Dollimore, T. Kinberg, G. Blair,  "Distributed systems: Concept and  Design", 5th Edition,  Addison-Wesley, 2012.

[3]

N.M. Josuttis, “SOA in Practice – The Art of  Distributed System Design”, O’Reilly, 2007

[4]

http://www.differencebetween.net/technology/difference-between-grid-computing-and-cloud-computing/

[5]

https://www.linux.com/training-tutorials/building-beowulf-cluster-just-13-steps

[6]

https://docs.microsoft.com/en-us/dotnet/framework/network-programming/socket-code-examples

 

 

 
Hệ thống Quản lý đào tạo phiên bản 1.0, 08/2016.
Địa chỉ: Bộ môn Hệ thống thông tin, khoa CNTT 1 Học viện Công nghệ Bưu chính Viễn thông
Email anhczvn@gmail.com Điện thoại: